data.frameの操作が楽々な「tidyr」パッケージの紹介です。一部「dplyr」パッケージを使用しています。dplyrも非常に便利です。
パッケージバージョンは0.4.1。実行コマンドはwindows 7のR version 3.2.5およびOS X 10.11.2のR version 3.2.4で確認しています。
パッケージのインストール
下記コマンドを実行してください。
#パッケージのインストール install.packages("tidyr")
実行コマンドの紹介
詳細はコマンド内を確認ください。
#パッケージの読み込み library("tidyr") ###データ例の作成##### n <- 30 TestData <- data.frame(Group = sample(paste0("ID", 1:5), n, replace = TRUE), Data1 = sample(c(1:15, NA), n, replace = TRUE), Data2 = sample(c(0, 1, NA), n, replace = TRUE)) #内容表示 head(TestData) Group Data1 Data2 1 ID1 7 1 2 ID1 13 NA 3 ID5 9 1 4 ID3 NA 0 5 ID2 6 1 6 ID4 4 NA #要約 summary(TestData) Group Data1 Data2 ID1:3 Min. : 1.00 Min. :0.0 ID2:7 1st Qu.: 5.00 1st Qu.:0.0 ID3:9 Median : 7.00 Median :0.5 ID4:6 Mean : 7.84 Mean :0.5 ID5:5 3rd Qu.:12.00 3rd Qu.:1.0 Max. :15.00 Max. :1.0 NA's :5 NA's :10 ######## #指定列の欠損値を除く:completeコマンド CompData <- complete(data = TestData, Data2) #要約 summary(CompData) Data2 Group Data1 Min. :0.0 ID1:2 Min. : 1.00 1st Qu.:0.0 ID2:5 1st Qu.: 5.75 Median :0.5 ID3:6 Median : 6.50 Mean :0.5 ID4:2 Mean : 7.25 3rd Qu.:1.0 ID5:5 3rd Qu.: 9.00 Max. :1.0 Max. :13.00 NA's :4 #NAを除き指定した列の全組み合わせを作成:expandコマンド ExData <- expand(TestData, Group, Data2) #表示 ExData Source: local data frame [10 x 2] Group Data2 (fctr) (dbl) 1 ID1 0 2 ID1 1 3 ID2 0 4 ID2 1 5 ID3 0 6 ID3 1 7 ID4 0 8 ID4 1 9 ID5 0 10 ID5 1 #NAを含む指定した列の全組み合わせを作成:nestingコマンド #expandコマンドと組み合わせて使用しています NesExData <- expand(TestData, nesting(Group, Data2)) #表示 head(NesExData) Source: local data frame [6 x 2] Group Data2 (fctr) (dbl) 1 ID1 0 2 ID1 1 3 ID1 NA 4 ID2 0 5 ID2 1 6 ID2 NA #基準を元にカテゴリおよび値データを縦方向に並べる;gatherコマンド #基準を設定:"-"をデータ名に付与する #処理後のカテゴリデータ名:keyオプション #処理後の値名:valueオプション GatherData <- gather(data = TestData, key = "Label", value = "value", -Group) #参考:ここまでを%>%で処理 #GatherData <- GatherData %>% gather(key = "Label", value = "value", -Group) #確認 GatherData[c(1:3, 57:60),] ID Group Label value (chr) (fctr) (chr) (chr) 1 1 ID1 ID 1 2 2 ID1 ID 2 3 3 ID5 ID 3 4 57 ID2 ID 57 5 58 ID3 ID 58 6 59 ID2 ID 59 7 60 ID2 ID 60 #基準を元にデータを横方向に並べる:spreadコマンド #データに識別番号が無いとエラーになります #install.packages("dplyr") #ライブラリの読み込み library("dplyr") #dplyrパッケージのadd_rownamesコマンドでIDを付与 GatherData <- add_rownames(GatherData, var = "ID") #処理 SprData <- spread(GatherData, key = "Label", value = "value") #dplyrパッケージのarrangeコマンドで昇順に並び替え #文字列IDをtype.convertで数値化 SprData <- arrange(SprData, type.convert(ID)) #参考:ここまでを%>%で処理 #SprData <- GatherData %>% add_rownames(var = "ID") %>% #spread(key = "Label", value = "value") %% arrange(type.convert(ID)) #確認 SprData[c(1:3, 57:60),] ID Group Data1 Data2 (chr) (fctr) (dbl) (dbl) 1 1 ID1 7 NA 2 2 ID1 13 NA 3 3 ID5 9 NA 4 57 ID2 NA NA 5 58 ID3 NA NA 6 59 ID2 NA 0 7 60 ID2 NA 1
少しでも、あなたのウェブや実験の解析が楽になりますように!!