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