【问题标题】:R: change data frame structure using values from one variable as new variableR:使用来自一个变量的值作为新变量更改数据帧结构
【发布时间】:2015-01-21 12:53:53
【问题描述】:
df1 <- data.frame(
    name = c("a", "b", "b", "c"),
    score = c(1, 1, 2, 1)
    )

如何从 df$name 和每个“对应”df$score 获取包含变量/列的新数据框。我认为这实际上是一个两步问题:

首先,我需要列出(在本例中)不等长向量,如下所示:

$a
[1] 1

$b
[1] 1 2

$c
[1] 1

其次,需要对 NA 进行填充,以便在制作所需的数据帧之前获得等长的向量 就像:

   a b  c
1  1 1  1
2 NA 2 NA 

我找不到任何简单的方法来做到这一点 - 我相信一定有! 如果可以使用 dplyr 交付解决方案,那就太棒了!谢谢!

【问题讨论】:

  • 这似乎是一个相当直接的从长到宽的重塑。在 SO 上查看有关此主题的大量帖子。搜索例如reshape2dcasttidyrspread.

标签: r list data-structures dataframe dplyr


【解决方案1】:

拆分数据:

(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

使用vapply 代替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

【讨论】:

  • 哦,是的。他们肯定是。那就更好了:)
  • “长度
  • @user3375672 - `length&lt;-` 将列表中每个向量的长度扩展到列表最长向量的长度,并用 NA 填充每个向量。 max(vapply(s, length, 1L)) 是我们将它们扩展到的长度
  • 这真的很聪明 - 当然可以在其他情况下使用它!
  • @user3375672 - 绝对。请注意:`length&lt;-`(x, 5)length(x) &lt;- 5 相同,但结果不会无形返回
猜你喜欢
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多