агрегировать по уровням факторов, а также итоги - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь суммировать значения числового столбца для каждого уровня фактора, но также получаю сумму всех уровней в результирующем фрейме данных.

например:

# 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.

заранее спасибо,

EDIT
оба ответа работают, но я пытаюсь найти решение, которое не является специальным. Я ищу что-то, что будет работать с несколькими переменными, например, такой вывод для более сложного фрейма данных:

# 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 ]

0 голосов
/ 10 января 2019

Также с пакетом janitor:

x <- aggregate(population ~ gender, d, FUN=sum)
library(janitor)

adorn_totals(x, "row")

 #gender population
 #female        300
 #  male        250
 # Total        550
0 голосов
/ 10 января 2019

Мы можем использовать xtabs с addmargins , чтобы получить общие итоги:

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
0 голосов
/ 10 января 2019

Можно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...