R 在数据帧中聚合行

R 在数据帧中聚合行,r,for-loop,aggregate,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 18

这是我正在使用的数据集(名为“
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
,我们将其转换为
character
类,然后将“Age”中以1开头,后面跟着2个数字的元素更改为“100+”,使用指定的
级别
将其重新转换为
因子
,并使用
聚合

 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

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


尽管更可靠的方法是直接将正则表达式传递给
by
语句(这在某种程度上是@akruns regex的修改,但我在这里直接使用
gsub


年龄是性格还是因素?请给出
str(我)
(编辑你的问题)!仅供参考,在R中,循环几乎从来都不是最好的选择,因为它们变得非常慢。相反,将代码矢量化。请查看
?lappy
,然后可能是一个教程,因为在您经常使用它之前,它是没有意义的。仅供参考,您似乎已经部分编辑了以前的答案,但现在它不起作用了!无论如何,谢谢你的帮助!好的,我暂时回退了,但这在您的数据集上运行得非常好。
unique(df$Age)[1:2]
在真实数据中为您提供了什么?我明白了:问题可能在于我有3个以上的年龄组,而不仅仅是90-94,95-99100+(我有21个年龄组)。有可能吗?那么我的解决方案应该不会有任何效果。。。你确定这样做正确吗?可能akruns给出了正确的结果。好的,请参阅我的新编辑。我认为这将是解决您的问题的最佳方案。如果您不介意的话,我借用了一些您的正则表达式逻辑(并对其进行了一些修改)。@DavidArenburg对我来说没问题。
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
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