R dplyr суммировать несколько факторов
У меня есть датафрейм, который я хочу обобщить, используя dplyr. В кадре данных есть несколько факторов, и я хочу сообщить об итогах каждого уровня факторов, суммированных по группе.
Есть ли способ сделать следующее, используя dplyr, не называя каждый уровень фактора в сводной инструкции.
библиотека (dplyr)
set.seed(123)
s <- rbinom(100,1,0.5)
s <- factor(s,0:1,c('M','F'))
a <- sample(1:4,100,TRUE)
a <- factor(a,1:4,c('oldest','old','young','youngest'))
w <- rnorm(100,40,10)
g <- rep(1:2,each=50)
df <- data.frame(sex=s, age=a, weight=w, group=g)
sm <- df %>% group_by(group) %>% summarise(
male = sum(ifelse(sex=='M',1,0))
,female = sum(ifelse(sex=='F',1,0))
,youngest = sum(ifelse(age=='youngest',1,0))
,young = sum(ifelse(age=='young',1,0))
,old = sum(ifelse(age=='old',1,0))
,oldest = sum(ifelse(age=='oldest',1,0))
,weight = mean(weight)
)
print(t(sm))
результат:
[,1] [,2]
group 1.000 2.00000
male 29.000 24.00000
female 21.000 26.00000
youngest 12.000 8.00000
young 13.000 17.00000
old 12.000 18.00000
oldest 13.000 7.00000
weight 37.461 40.38807
2 ответа
Решение
Использование dplyr (хотя и обходным, хакерским способом!):
df %>%
mutate(row_number1 = row_number(), row_number2 = row_number()) %>%
spread(sex, row_number1) %>%
spread(age, row_number2) %>%
group_by(group) %>%
mutate_each(funs(ifelse(is.na(.), 0, 1)), -weight) %>%
mutate(count = 1) %>%
summarize_each(funs(sum)) %>%
mutate(weight = weight / (count)) %>%
select(-count) %>%
t()
результат:
[,1] [,2]
group 1.000 2.00000
weight 37.461 40.38807
M 25.000 28.00000
F 25.000 22.00000
oldest 13.000 7.00000
old 12.000 18.00000
young 13.000 17.00000
youngest 12.000 8.00000
Я предполагаю, что для факторов вы хотите таблицы, а для чисел (например, weight
Вы хотите, значит.
Это, без использования dplyr, делает то, что вы хотите, хотя результат может быть отформатирован не так, как вам нравится.
sapply(df, function(x) if (is.factor(x)) table(x, df$group) else tapply(x, df$group, mean))
Вы также можете посмотреть на reporttools
пакет, в том числе tableNominal
а также tableContinuous
,