聚合数据框中的行
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
,我们将其转换为character
class,然后更改"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
这是我正在使用的数据集(名为“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
class,然后更改"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