按某一列对数据框进行分组,并获取各列的总和

4

我有一个如下的示例数据框,我想创建另一个数据框,该数据框包含按某一列的统计信息,您怎么做呢?

例如,在下面的数据框中,我希望按图表获取每个列的总和。

示例数据框:

Chart    Sum     Sum_Squares    Count     Average
Chart1   2           4            4         1
Chart1   3           9            3         1.5
Chart2   4           16           5         2
Chart2   5           25           2         2.5

期望的输出结果:

Chart    Sum_sum      Sum_square_sum      Count_sum      Average_sum
Chart1      5              13                 7              2.5
Chart2      9              41                 7              4.5

我已经尝试了以下代码,但返回的表格只包含图表和V1。sum_stat是数据框。

  sum_stat = data.table(spc_point[,c("CHART", "SUM", "SUM_SQUARES", "COUNT", "AVERAGE")])[,c(SUM_SUM=sum(SUM), SUM_SQUARE_SUM=sum(SUM_SQUARES), COUNT_SUM=sum(COUNT), AVERAGE_SUM=sum(AVERAGE)),by=list(CHART)]

感谢提前


@Henrik,已添加我尝试过的内容。 - Ianthe
请看我的答案,正确使用数据表。如果您有一个数据框,比如 DF,您只需要执行 DF<-data.table(DF,key="Chart"),然后按组执行您想要的命令,同时使用 .SD 标记来使用数据表的部分进行命令操作。 - Sarunas
感谢大家的回答和建议。^_^ - Ianthe
3个回答

6

我建议使用data.table尝试一下:

data<-data.table("Chart"=c("Chart1","Chart1","Chart2","Chart2"), "Sum"=c(2,3,4,5),"Sum_Squares"=c(4,9,16,25),"Count"=c(4,3,5,2),"Average"=c(1,1.5,2,2.5),key="Chart")

然后只需简单地执行以下操作:
summed.data<-data[,lapply(.SD,sum),by=Chart]

找到data.table包,阅读vignette和faq - 使用它 :)


1
>=1.9.0版本中,还有一个新的setDT函数,它允许通过引用将数据框转换为数据表:setDT(X)[, lapply(.SD, sum), by=Chart]。这里X将被转换为data.table - Arun
哦,不错!谢谢指出这个问题,我一定会记住的 :) - Sarunas

3
你可以考虑使用 dplyr。假设你的数据框名为 df,下面的代码可以产生所需的结果。
library(dplyr)
df %.% group_by(Chart) %.% 
    summarise(Sum=sum(Sum), 
              Sum_Squares = sum(Sum_Squares), 
              Count= sum(Count),
              Average= sum(Average))

或者在 data.table 中也可以这样布置:
dt = as.data.table(df)
dt[, list(Sum=sum(Sum), 
          Sum_Squares = sum(Sum_Squares), 
          Count= sum(Count),
          Average= sum(Average)),
   by=Chart]

1
那不会得到期望的结果。你可能想要使用 sum(Average) - Matt Dowle
1
我将 mean(Average) 编辑为 sum(Average),并添加了长格式的 data.table 语法,以便您进行比较。由于应用的是相同的函数(现在更清晰,因为它不是 mean(Average)),因此也可以使用 lapply(.SD,sum),就像 Sarunas 的答案中所示。 - Matt Dowle
顺便问一下,为什么我们要加平均值?我认为对于平均数的平均数进行(加权)平均更有意义。 - Randy Lai
当然可以,但我们必须首先按照问题所问的回答,以便答案是正确的。然后再添加更多内容或评论,以进一步深入讨论。 - Matt Dowle

2

在基础R中:

aggregate(df[,2:5],by=list(df$Chart),FUN=sum)
#   Group.1 Sum Sum_Squares Count Average
# 1  Chart1   5          13     7     2.5
# 2  Chart2   9          41     7     4.5

正如@AnandaMahto指出的那样,aggregate(...)函数的公式语法更加简洁明了。
aggregate(. ~ Chart, df, sum)
#    Chart Sum Sum_Squares Count Average
# 1 Chart1   5          13     7     2.5
# 2 Chart2   9          41     7     4.5

4
+1,但是公式语法更加简洁,输入和输出方面都更加干净:aggregate(. ~ Chart, df, sum) - A5C1D2H2I1M1N2O1R2T1
当然可以。我忘记了你可以在函数的左侧使用 .。希望你不介意我把它加到我的答案中。 - jlhoward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接