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
  • 对于(y),对于(x),子集。Pro:可直接进行
    求和
    等操作。缺点:代码太多,可能速度太慢
  • 与原始表和聚合表并行工作。赞成:可以做
    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$n
    sapply
    用于
    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()
    可以帮助一步完成总结。