按因子水平和总计聚合

3
我尝试对一个数字列的每个因子水平进行求和,同时也要得到结果数据框中所有水平的总和。例如:
# Type gender population
# A    male      100
# B    male      150
# A    female    125
# B    female    175

使用聚合函数,我可以得到:

aggregate(population ~ gender, df, sum)

# gender population
# male      250
# female    300

但是有没有一种方法可以得到一个同时对两个级别求和的输出呢?
# gender population
# all       550
# male      250
# female    300

使用SAS的proc tabulate可以轻松完成此操作,希望在R中也有相应的方法。

提前感谢您的帮助。

编辑
给出的两个答案都可行,但我正在尝试找到一种不那么临时的解决方案。我正在寻找适用于多个变量的解决方案,例如对于更复杂的数据框的输出:

# Type gender population
# all  all     500
# all  male    200
# all  female  300
# A    all     250
# A    male    100
# A    female  150
# B    all     250
# B    male    100
# B    female  150

抱歉,如果之前表述不够清楚。
3个回答

4
你可以使用 rbind 函数,即:
d1 <- aggregate(population ~ gender, df, sum)    
rbind(data.frame(gender = 'total', population = sum(d1$population)), d1)

#  gender population
#1  total        550
#2 female        300
#3   male        250

4
我们可以使用addmargins函数和xtabs函数来获得总体统计数据:
df1 <- read.table(text = "
Type gender population
A    male      100
B    male      150
A    female    125
B    female    175", header = TRUE, stringsAsFactors = FALSE)

df2 <- read.table(text = "
Type gender population
all  all     500
all  male    200
all  female  300
A    all     250
A    male    100
A    female  150
B    all     250
B    male    100
B    female  150", header = TRUE, stringsAsFactors = FALSE)

data.frame(addmargins(xtabs(population ~ gender, df1)))
#   gender Freq
# 1 female  300
# 2   male  250
# 3    Sum  550

data.frame(addmargins(xtabs(population ~ gender, df2)))
#   gender Freq
# 1    all 1000
# 2 female  600
# 3   male  400
# 4    Sum 2000

4
请注意,如果您对多变量制表感兴趣,可以在 ~ 右侧使用多个变量。例如,data.frame(addmargins(xtabs(population ~ gender + Type, df2))) 将为您提供按组求和以及总和。 - IceCreamToucan
@IceCreamToucan刚刚注意到你删除了你的答案,如果有额外的“注释”,请随意撤销删除,我们是同时发布答案的。 - zx8754
谢谢@zx8754,这正是我在寻找的。有没有办法将总和放在数据框的顶部而不是底部? - guybrush

2
此外,还有一个名为janitor的软件包:
x <- aggregate(population ~ gender, d, FUN=sum)
library(janitor)

adorn_totals(x, "row")

 #gender population
 #female        300
 #  male        250
 # Total        550

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接