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,

Другие вопросы по тегам