聚合数据框中的行

时间:2016-01-08 09:26:15

标签: r for-loop aggregate

这是我正在使用的数据集(名为“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-loop但我真的不知道从哪里开始。

2 个答案:

答案 0 :(得分:4)

如果“年龄”列为factor,我们会将其转换为character类,然后将“年龄”中的元素更改为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

答案 1 :(得分:4)

使用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