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