2014-11-23 98 views
2
df1 <- data.frame(
    name = c("a", "b", "b", "c"), 
    score = c(1, 1, 2, 1) 
    ) 

我怎樣才能獲得與來自DF $名稱以及與每個「相應的」 df$score變量/列的新數據幀變化的數據幀結構。我估計,它實際上是一個兩步的問題:R:使用從一個變量的值作爲新的變量

首先,我需要做的列表(在這個例子中)長度不等的載體是這樣的:

$a 
[1] 1 

$b 
[1] 1 2 

$c 
[1] 1 

二的NAS需要如此補齊一個得到同等長度的向量執行所需的數據幀 之前會是這樣:

a b c 
1 1 1 1 
2 NA 2 NA 

我無法找到任何簡單的方法來做到這一點 - 我敢肯定一定有! 如果解決方案可以使用dplyr交付,那就太棒了!謝謝!

+0

使用vapply這似乎就像一個相當簡單的從長久到寬大的案例重塑。看看關於SO這個主題的帖子gazillinon。搜索例如'reshape2'和'dcast'; 'tidyr'和'spread'。 – Henrik 2014-11-24 08:34:18

回答

4

要拆分數據:

(s <- split(df1$score, df1$name)) 
# $a 
# [1] 1 
# 
# $b 
# [1] 1 2 
# 
# $c 
# [1] 1 

要創建新的數據幀:

as.data.frame(sapply(s, `length<-`, max(vapply(s, length, 1L)))) 
# a b c 
# 1 1 1 1 
# 2 NA 2 NA 

稍微更有效的將是地方的sapply

len <- max(vapply(s, length, 1L)) 
as.data.frame(vapply(s, `length<-`, double(len), len)) 
# a b c 
# 1 1 1 1 
# 2 NA 2 NA 
+0

不錯。但是'sp'的名字已經是's'的名字了? – 2014-11-23 21:14:37

+0

哦,是的。他們確實是。這更好:) – 2014-11-23 21:15:30

+0

什麼'長度< - '在做什麼? – user3375672 2014-11-23 21:17:30