我想将数据框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中有什么选择?
apply
。亲:一张桌子里的所有东西。 Con:复杂的表结构,不能使用sum
等。sum
等。 Con:很多代码,可能很慢。sum
等.Con:数据重复。答案 0 :(得分:2)
总和和矢量化不适用于列表,您只需使用sapply
和lapply
执行此任务:
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