2011-07-20 25 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 

也許像meltreshape與看中選項?

回答

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

實際上並不必然具有相同數量的條目的所有行適當的數據幀,所以正確的答案是你可能想要一個列表。如果這是不是真的,你想要什麼,那麼試試這個:

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 

你需要T(),因爲申請行操作的變調,因爲列主順序是R強加的結果。

如果你想要的名單版本,那麼這裏有一個辦法:

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"