聚合数据框中的行

Aggregate rows in data frame

这是我正在使用的数据集(名为“ME”)的一部分:

   Year    Age   FemaleEXP  MaleEXP  TotalEXP  FemaleM   MaleM    TotalM 
1  1800   90-94    396.85    167.93    564.78   174.64    94.03   268.67
2  1800   95-99     42.70     12.31     55.01    27.62    13.67    41.29
3  1800 100-104      0.74      0.05      0.79     1.75     0.29     2.04
4  1800 105-109      0.00      0.03      0.00     0.01     0.00     0.00
5  1800    110+      0.00      0.00      0.00     0.00     0.00     0.00

我想将最后 3 行合并为一行,如下所示:

  Year    Age   FemaleEXP  MaleEXP  TotalEXP  FemaleM   MaleM    TotalM 
1  1800   90-94    396.85    167.93    564.78   174.64    94.03   268.67
2  1800   95-99     42.70     12.31     55.01    27.62    13.67    41.29
3  1800    100+      0.74      0.08      0.79     1.76     0.29     2.04

问题是我有一年多了(1800-2014)。如何汇总每年的行?我想我应该使用 for 循环,但我真的不知道从哪里开始。

如果"Age"列为factor,我们将其转换为characterclass,然后更改"Age"中以1开头的元素再增加 2 个数字到“100+”,将其重新转换为 factor 并指定 levels 并使用 aggregate.

 dfN$Age <- as.character(dfN$Age)
 dfN$Age[grep('^1\d{2}-?', dfN$Age)] <- "100+"
 dfN$Age <- factor(dfN$Age, levels=unique(dfN$Age))
 aggregate(.~Year+Age, dfN, sum) 
 #      Year   Age FemaleEXP MaleEXP TotalEXP FemaleM MaleM TotalM
 #1 1800 90-94    396.85  167.93   564.78  174.64 94.03 268.67
 #2 1800 95-99     42.70   12.31    55.01   27.62 13.67  41.29
 #3 1800  100+      0.74    0.08     0.79    1.76  0.29   2.04

使用 data.table 您可以通过两个简单的步骤完成此操作(无论 Age 是否是一个因素)

library(data.table)
setDT(df)[!Age %in% c("90-94", "95-99"), Age := "100+"]
df[, lapply(.SD, sum), by = .(Year, Age)]
#    Year   Age FemaleEXP MaleEXP TotalEXP FemaleM MaleM TotalM
# 1: 1800 90-94    396.85  167.93   564.78  174.64 94.03 268.67
# 2: 1800 95-99     42.70   12.31    55.01   27.62 13.67  41.29
# 3: 1800  100+      0.74    0.08     0.79    1.76  0.29   2.04

虽然更稳健的方法是直接将正则表达式传递给 by 语句(这在某种程度上是对@akruns 正则表达式的修改,但我在这里直接使用 gsub

setDT(df)[, lapply(.SD, sum), by = .(Year, Age = sub('^\d{3}.*', "100+", Age))]
#    Year   Age FemaleEXP MaleEXP TotalEXP FemaleM MaleM TotalM
# 1: 1800 90-94    396.85  167.93   564.78  174.64 94.03 268.67
# 2: 1800 95-99     42.70   12.31    55.01   27.62 13.67  41.29
# 3: 1800  100+      0.74    0.08     0.79    1.76  0.29   2.04