对数据帧内的列表进行计算

时间:2017-08-23 20:50:42

标签: r dataframe aggregate

我想将数据框f汇总到新数据框g中,以便列g$z包含来自所有分组值的列表专栏f$z。乍一看,这似乎有效:

f = data.frame(x=c(1, 1, 1, 2), y=c(4, 4, 5, 6), z=c(11, 12, 13, 14))
g = aggregate(z ~ x + y, f, c)

  x y      z
1 1 4 11, 12
2 1 5     13
3 2 6     14

现在,我想对列c中的列表对数据帧中的所有行进行不同的计算,并将结果放在同一数据帧的新列中。但这不起作用!

g$m = sum(g$z)
g$n = g$z + 1

Error in sum(g$z) : invalid 'type' (list) of argument

如何使用上面尝试的数据框单元格中的列表?或者这只是不喜欢/不可能?如果是这样,那么正确的方法是什么?

更新

我的基本目标是对原始数据集中的X和Y的所有组合进行大量的分组操作。我一般在R中有什么选择?

  1. 使用apply。亲:一张桌子里的所有东西。 Con:复杂的表结构,不能使用sum等。
  2. 代表(y),代表(x),子集。亲:可以直接做sum等。 Con:很多代码,可能很慢。
  3. 与原始和聚合表并行工作。专业:可以做sum等.Con:数据重复。
  4. 其他选择?

1 个答案:

答案 0 :(得分:2)

总和矢量化不适用于列表,您只需使用sapplylapply执行此任务:

g$m <- sapply(g$z, sum)
g$n <- lapply(g$z, `+`, 1)

g
#  x y      z  m      n
#1 1 4 11, 12 23 12, 13
#2 1 5     13 13     14
#3 2 6     14 14     15

或者,如果您使用tidyverse,则可以使用map + mutate

g %>% mutate(m = map_dbl(z, sum), n = map(z, ~.x + 1))

#  x y      z  m      n
#1 1 4 11, 12 23 12, 13
#2 1 5     13 13     14
#3 2 6     14 14     15