R:

2011-07-20 7 views
1

を再形成するテーブルについての質問私は、次のデータフレームを持っている:R:

id,property1,property2,property3 
1,1,0,0 
2,1,1,0 
3,0,0,1 
4,1,1,1 

d.f <- structure(list(id = 1:4, property1 = c(1L, 1L, 0L, 1L), property2 = c(0L, 
1L, 0L, 1L), property3 = c(0L, 0L, 1L, 1L)), .Names = c("id", 
"property1", "property2", "property3"), class = "data.frame", row.names = c(NA, 
-4L)) 

次のデータフレームを取得するための最も厄介な方法は何ですか:たぶん

id,properties_list 
1,property1 
2,property1, property2 
3,property3 
4,property1, property2, property3 

meltまたはreshapeとのようなものファンシーオプション?

答えて

2

このソリューションは、あなたが(一緒にプロパティを貼り付ける)GSK3が質問を解釈する方法に類似したデータフレームのためではなく、と探していると仮定しforループを義務的に回避すると、それがRでどのようにロールバックするのでしょうか。

property_list <- apply(d.f[,-1],1, 
        FUN=function(x,nms){paste(nms[as.logical(x)],collapse=",")}, 
         nms=colnames(d.f)[-1]) 

as.data.frame(cbind(d.f$id,property_list)) 


    V1     property_list 
1 1      property1 
2 2   property1,property2 
3 3      property3 
4 4 property1,property2,property3 
+0

私はループを回避するつもりはなかった...しかし、ええ - ループを回避しようとすると、もっと多くのRを学ぶことができます:) – Leo

2

これはまったく変形ではありません。 pasteを使用してください。

for(i in seq(1,3)) { 
    tf <- as.logical(d.f[,i+1]) 
    d.f[,i+1] <- as.character(d.f[,i+1]) 
    d.f[,i+1][tf] <- colnames(d.f)[i+1] 
    d.f[,i+1][!tf] <- " " 
} 
d.f$property.list <- paste(d.f[,2],d.f[,3],d.f[,4],sep=" ") 

あなたならばいつものように、あなたが最初にdput()あなたのデータフレームより良い答えを得るでしょう:

d.f <- structure(list(id = 1:4, property1 = c(1L, 1L, 0L, 1L), property2 = c(0L, 
1L, 0L, 1L), property3 = c(0L, 0L, 1L, 1L)), .Names = c("id", 
"property1", "property2", "property3"), class = "data.frame", row.names = c(NA, 
-4L)) 
+0

'dput'に感謝します! – Leo

2

実際に同じ数のエントリを持つすべての行を持っている必要の適切なデータフレームではありません、正しい答えはあなたがリストを望むかもしれないということです。それは本当にあなたが望むものではない場合は、これを試してください:行操作が原因でRが課す列優先順位の彼らの結果を転置適用されるため

dfrm[-1] <- t(apply(dfrm[-1], 1, function(x) ifelse(x, names(x), "")) ) 
dfrm 
    id property1 property2 property3 
1 1 property1      
2 2 property1 property2   
3 3      property3 
4 4 property1 property2 property3 

あなたはトンを()が必要です。

リストのバージョンを希望した場合は、その後、ここで一つのアプローチです:

prop_list <- apply(dfrm[-1], 1, function(x) c(names(x)[ as.logical(x)] )) 
names(prop_list) <- dfrm[,1] 
prop_list 
$`1` 
[1] "property1" 

$`2` 
[1] "property1" "property2" 

$`3` 
[1] "property3" 

$`4` 
[1] "property1" "property2" "property3"