R 对数据帧内的列表进行计算
我想将数据帧R 对数据帧内的列表进行计算,r,dataframe,aggregate,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中的列表进行不同的计算,并将结果放入同一数据框中的
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的所有组合执行大量的分组操作。一般来说,我有什么选择
应用
。赞成者:所有的东西都放在一张桌子上。缺点:表格结构复杂,不能使用sum
等求和
等操作。缺点:代码太多,可能速度太慢sum
等。反对:数据重复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
求和和和矢量化不适用于列表,您可以简单地使用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
sapply
用于g$m
,如下所示。和g$nsapply
用于g$m
,如下所示。和g$n使用vapply
,而不是sapply
vapply
始终返回具有已知维度的指定类型的向量sapply
可以返回向量、数组或列表,具体取决于输入。@NathanWerth-返回结构更多地取决于FUN
而不是X
。由于sum
将始终返回长度为1的数字,sapply
将始终返回原子向量(前提是simplify=TRUE
)<代码>vapply
速度更快。使用apply工作!不过,我已经更新了这个问题,以反映如何最好地处理R中的分组数据。@Rich您是对的,sapply
的结果的形状在使用sum
时是有保证的。我只是为阅读你答案的人记下“最佳通用做法”。不确定我是否完全理解你的更新。但是对于dplyr,类似这样的f%%>%groupby(x,y)%%>%summary(m=sum(z),n=list(2*z),z=list(z))%%>%as.data.frame()
可以帮助一步完成总结。使用vapply
,而不是sapply
vapply
始终返回具有已知维度的指定类型的向量sapply
可以返回向量、数组或列表,具体取决于输入。@NathanWerth-返回结构更多地取决于FUN
而不是X
。由于sum
将始终返回长度为1的数字,sapply
将始终返回原子向量(前提是simplify=TRUE
)<代码>vapply
速度更快。使用apply工作!不过,我已经更新了这个问题,以反映如何最好地处理R中的分组数据。@Rich您是对的,sapply
的结果的形状在使用sum
时是有保证的。我只是为阅读你答案的人记下“最佳通用做法”。不确定我是否完全理解你的更新。但是对于dplyr,类似这样的f%%>%groupby(x,y)%%>%summary(m=sum(z),n=list(2*z),z=list(z))%%>%as.data.frame()
可以帮助一步完成总结。