R применить 2 разные функции в summarise_at - PullRequest
1 голос
/ 28 мая 2020

У меня есть следующие модифицированные mtcars: mtcars2 <- mtcars ; mtcars2[1,2] <- mtcars2[1,2] <- NA ; mtcars2 <- mtcars2[,c("vs","cyl", "disp")] Я хочу применить group_by "vs", суммируя первый столбец без NA и применив длину ко второму столбцу mtcars2.

Я пробую это:

mtcars3 <- mtcars2 %>% group_by(vs) %>% summarise_at(vars(names(mtcars2[-1])), list( Total = sum, n = length), na.rm=T)

он говорит, что параметр na.rm также применяется к длине, что вызывает проблему.

результат, который я хочу, будет примерно таким:

mtcars3 <- mtcars3 <- mtcars2 %>% group_by(vs) %>% 
                      summarise_at(vars(names(mtcars2[-1])), list( Total = sum, n = length))
mtcars3 [1,2] <- sum(mtcars2$cyl, na.rm = T)
res <- mtcars3 %>% mutate(n = cyl_n)%>% select(-disp_n, -cyl_n)
res

есть идея?

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы можете использовать:

library(dplyr)

mtcars2 %>% 
  group_by(vs) %>% 
  summarise_at(vars(-group_cols()), 
              list(Total = ~sum(., na.rm = TRUE), n = length))


# A tibble: 2 x 5
#     vs cyl_Total disp_Total cyl_n disp_n
#  <dbl>     <dbl>      <dbl> <int>  <int>
#1     0       128      5529.    18     18
#2     1        64      1854.    14     14

Если вам нужен только один столбец из n, в этом случае выполните:

mtcars2 %>% 
  mutate(n = 1) %>%
  group_by(vs) %>% 
  summarise_at(vars(-group_cols()), list(Total = ~sum(., na.rm = TRUE)))


# A tibble: 2 x 4
#     vs cyl_Total disp_Total n_Total
#  <dbl>     <dbl>      <dbl>   <dbl>
#1     0       128      5529.      18
#2     1        64      1854.      14
0 голосов
/ 28 мая 2020

Мы также можем использовать data.table

library(data.table)
as.data.table(mtcars2)[, c(lapply(.SD, sum, na.rm = TRUE), .(n = .N)) , vs]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...