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