Rでコマンド:よく使うclassの作成方法と操作例の紹介

Rの解析に役に立つ記事

Rで解析する際によく使用しているclassの作成方法と操作例の紹介です。基本的なコマンドです。とりあえず、日常的な使用範囲のコマンド例です。

実行コマンドはwindows 7およびOS X 10.11.2のR version 3.2.3で確認しています。


スポンサーリンク
スポンサーリンク

vector classの例

同じ型の要素を1次元に並べたものです。基本となるclassです。

###作成コマンド#####
#規則的なベクトル:seqコマンド
#例えば1から10まで2の公差
seq(1, 10, by = 2)
[1] 1 3 5 7 9

#繰り返しのあるベクトル:repコマンド
#例えば長さが10で1から5を繰り返す
rep(1:5, length = 10)
[1] 1 2 3 4 5 1 2 3 4 5
#例えば1から2を5回繰り返す
rep(1:2, time = 5)
[1] 1 2 1 2 1 2 1 2 1 2

#名前を付与する:namesコマンド
Test <- rep(1:2, time = 5)
names(Test) <- LETTERS[1:10]
#確認
Test
A B C D E F G H I J 
1 2 1 2 1 2 1 2 1 2 

###操作例#####
#結合:cコマンド
c(seq(1, 10, by = 2), rep(1:2, time = 5))
[1] 1 3 5 7 9 1 2 1 2 1 2 1 2 1 2

#データの取り出し:[ ]で指定
#例えば3番目を取り出す
Test <- seq(1, 10, by = 2)
Test[3]
[1] 5
#例えばラベルでも可能
Test <- rep(1:2, time = 5)
names(Test) <- LETTERS[1:10]
Test["E"]
E 
1 

#条件に合う要素の位置と値を取得:whichコマンド
#例えば4の倍数の位置
Test <- print(sample(40:50, size = 20, replace = TRUE))
[1] 50 50 50 48 44 47 50 44 46 45 49 48 45 40 48 49 40 48 44 49
which(Test %% 4 == 0)
[1]  4  5  8 12 14 15 17 18 19
#例えば4の倍数の値
Test[which(Test %% 4 == 0)]
[1] 48 44 44 48 40 48 40 48 44

#長さを取得:lengthコマンド
length(rep(1:2, time = 5))
[1] 10

#順序を逆転する:revコマンド
rev(1:10)
[1] 10  9  8  7  6  5  4  3  2  1

#重複する値を取り除く:uniqueコマンド
unique(rep(1,10))
[1] 1

matrix classの例

行列で2次元の情報を持つベクトルです。

###作成コマンド#####
#例えば5*5の大きさを作成
matrix(1:25, nrow = 5,  ncol = 5)
[,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25
#例えば名前を付与して作成
#listで指定するのがポイント
matrix(1:25, nrow = 5,  ncol = 5,
       dimnames = list(letters[1:5], LETTERS[1:5]))
A  B  C  D  E
a 1  6 11 16 21
b 2  7 12 17 22
c 3  8 13 18 23
d 4  9 14 19 24
e 5 10 15 20 25

#例えば値が0で5*5の大きさを作成:mat.or.vecコマンド
mat.or.vec(5, 5)
[,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    0    0    0    0    0
[5,]    0    0    0    0    0

###操作例#####
#結合する:rbind,cbind
#例えばrbind
rbind(mat.or.vec(2, 2), mat.or.vec(2, 2))
[,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    0    0
[4,]    0    0

#データの取り出し:[ , ]で指定
Test <- print(matrix(1:9, 3, 3))
[,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
#取り出し
Test[2, 2]
[1] 5

#転置行列:tコマンド
t(Test)
[,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

#対角行列:diagコマンド
diag(1, 3, 3)
[,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

#対角より上部,下部を置換する:upper.tri,lower.triコマンド
Test <- print(mat.or.vec(3, 3))
[,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
#上部を1で置換
Test[upper.tri(Test)] <- 1
[,1] [,2] [,3]
[1,]    0    1    1
[2,]    0    0    1
[3,]    0    0    0
#対角を含めて下部を2で置換
Test[lower.tri(Test, diag = TRUE)] <- 2
[,1] [,2] [,3]
[1,]    2    1    1
[2,]    2    2    1
[3,]    2    2    2

data.frame classの例

行列の2次元情報を持ちますが、データの型は異なっていても格納することができます。ただし、データの長さは同じでなければなりません。

###作成コマンド#####
n <- 100
TestData <- data.frame(Group = sample(paste0("Group", 1:5),
                                      size = n, replace = TRUE),
                       Data1 = sample(c(1:5, NA), size = n, replace = TRUE),
                       Data2 = 1:n)
#データ構造を確認
#文字列はfactor classになります
str(TestData)
'data.frame':	100 obs. of  3 variables:
  $ Group: Factor w/ 5 levels "Group1","Group2",..: 3 1 2 1 1 4 2 2 3 2 ...
$ Data1: int  NA 2 NA 2 1 NA 1 5 5 2 ...
$ Data2: int  1 2 3 4 5 6 7 8 9 10 ...

#文字列をfactor classにしない:Iコマンド
ITestData <- data.frame(Group = I(sample(paste0("Group", 1:5),
                                         size = n, replace = TRUE)),
                        Data1 = sample(c(1:5, NA), size = n, replace = TRUE),
                        Data2 = 1:n)
#データ構造を確認
str(ITestData)
'data.frame':	100 obs. of  3 variables:
  $ Group:Class 'AsIs'  chr [1:100] "Group3" "Group2" "Group2" "Group4" ...
$ Data1: int  5 4 1 NA 1 NA 3 4 2 2 ...
$ Data2: int  1 2 3 4 5 6 7 8 9 10 ...

#データ数が異なるとエラーになります
data.frame(Data1 = 1:5,
           Data2 = 1:2)
data.frame(Data1 = 1:5, Data2 = 1:2) でエラー: 
引数に異なる列数のデータフレームが含まれています: 5, 2

###操作例#####
#データ先頭部分を表示:headコマンド
head(TestData)
Group Data1 Data2
1 Group3    NA     1
2 Group1     2     2
3 Group2    NA     3
4 Group1     2     4
5 Group1     1     5
6 Group4    NA     6

#データ先頭部分を表示:tailコマンド
tail(TestData)
Group Data1 Data2
95  Group2     1    95
96  Group1     1    96
97  Group2     5    97
98  Group5     5    98
99  Group3     2    99
100 Group5     1   100

#データの要約:summaryコマンド
summary(TestData)
Group        Data1           Data2       
Group1:16   Min.   :1.000   Min.   :  1.00  
Group2:28   1st Qu.:2.000   1st Qu.: 25.75  
Group3:20   Median :3.000   Median : 50.50  
Group4:16   Mean   :3.106   Mean   : 50.50  
Group5:20   3rd Qu.:4.000   3rd Qu.: 75.25  
Max.   :5.000   Max.   :100.00  
NA's   :15

#欠損値を含まないGroupデータを表示:complet.cases
CompletData <- TestData[complete.cases(TestData),]
#要約
summary(CompletData)
    Group        Data1           Data2       
Group1:15   Min.   :1.000   Min.   :  2.00  
Group2:25   1st Qu.:2.000   1st Qu.: 28.00  
Group3:15   Median :3.000   Median : 51.00  
Group4:13   Mean   :3.106   Mean   : 51.52  
Group5:17   3rd Qu.:4.000   3rd Qu.: 76.00  
            Max.   :5.000   Max.   :100.00 

#グループ毎に関数を適用:aggregateコマンド
#グループはlistでbyに指定
aggregate(TestData[, 2:3], by = list(TestData[, 1]), mean, na.rm = TRUE)
  Group.1    Data1    Data2
1  Group1 2.909091 41.84000
2  Group2 3.000000 57.32143
3  Group3 2.866667 47.88889
4  Group4 3.083333 51.35714
5  Group5 2.666667 54.53333

list classの例

データの長さ及び型が異なっていても格納することができます。

#data.frameと違い長さが違うオブジェクトが個別に格納できます
list(Test1 = seq(1, 10, by = 2),
     Test2 = matrix(1:25, nrow = 5,  ncol = 5),
     Test3 = data.frame(Data1 = 1:5,
                        Data2 = 1:5))
$Test1
[1] 1 3 5 7 9
$Test2
[,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25
$Test3
  Data1 Data2
1     1     1
2     2     2
3     3     3
4     4     4
5     5     5

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました