Почему group_by не работает с max (colSums) в dplyr - PullRequest
0 голосов
/ 03 июля 2018

Я хочу знать для каждой страны максимальную сумму продолжительности начальной, средней и старшей школы (потому что для каждого года продолжительность может не совпадать). Во-первых, я group_by country и использую colSum, но полученное мной значение было максимальным (colSum) для всех, что означает, что group_bu здесь вообще не работает.

Я провел некоторое исследование и отделил «plyr». На самом деле, если я попытаюсь

df1 <- mtcars %>%
  group_by(cyl, gear) %>%
  summarise(
    newvar = sum(wt)
  )

это хорошо работает. Но здесь я не изменяюсь не по одному столбцу, а по многим столбцам. Вы знаете, что мне делать, чтобы это исправить?

Большое спасибо.

 data1 = data.frame(country = c("A",'A',"A",'A',"B","B","B","B"),
    item = c("Age for primary school","Duration for primary school", "Duration for middle school", "duration for high school",
             "Age for primary school","Duration for primary school", "Duration for middle school", "duration for high school"), 
                     '2008' = c(6, 6, 4, 3,7,5,4,3),  
                     '2009' = c(6, 6, 4, 3,6,6,4,3), 
                     '2010' = c(7, 5, 4, 3,6,6,4,3),  
                     '2011' = c(7, 5, 4, 3,7,5,4,3)) 
  temp1 <- dplyr::filter(data1, item != 'Age for primary school') %>%
    dplyr::group_by(country) %>%
    dplyr::mutate(n_grade = max(colSums(.[,-c(1:2)], na.rm = TRUE))) 

1 Ответ

0 голосов
/ 03 июля 2018

Если вы используете . в mutate, он займет левую часть канала, то есть весь data.frame / tibble, а не отдельные группы. Вместо этого вы можете использовать do.

temp1 <- dplyr::filter(data1, item != 'Age for primary school') %>%
            dplyr::group_by(country) %>%
            dplyr::do(mutate(., n_grade = max(colSums(.[,-c(1:2)], na.rm = TRUE))))

Как примечание, это то, как вы можете сделать это с data.table

library(data.table)
setDT(data1)
temp1 <- 
data1[item != 'Age for primary school'] %>% 
    .[, n_grade := max(colSums(.SD, na.rm = TRUE))
      , by = country
      , .SDcols = -(1:2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...