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
少しでも、あなたの解析が楽になりますように!!