2014-11-23 156 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