Как подсчитать один столбец и сложить несколько столбцов одновременно с помощью суммирования в dplyr R - PullRequest
1 голос
/ 28 мая 2020

У меня есть этот фрейм данных (есть еще 20 столбцов, таких как class, но только для примера я показываю короткую версию):

 niv  ID  class1 class2 class3
  A   x    10      5      7
  A   y    15      3      1
  A   z    11      2      4
  B   u    17      7      3
  B   w    18      7      9

Итак, я хотел group_by(niv) и резюмировать * Столбец 1006 * просто подсчитывает его, а столбцы class1, class2 и class3 складываются в одну команду. Я пробовал summarise_each, но не могу понять, как его использовать. Также целью было бы научиться смешивать разные развлечения в функции суммирования, когда у вас есть фрейм данных с большим количеством столбцов.

Мне нужен суммарный фрейм данных:

 niv  n_ID  sum_class1 sum_class2 sum_class3
  A    3        36         10         12
  B    2        35         14         12

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Мы можем использовать summarise с across

library(dplyr)
df %>%
   mutate(n_ID = 1) %>%
   group_by(niv) %>%
   summarise(across(starts_with('class'), sum))

С across, мы можем иметь несколько функций

iris %>%      
   summarise(across(where(is.factor), nlevels), 
            across(where(is.numeric), mean))
#  Species Sepal.Length Sepal.Width Petal.Length Petal.Width
#1       3     5.843333    3.057333        3.758    1.199333

data

df <- structure(list(niv = c("A", "A", "A", "B", "B"), ID = c("x", 
"y", "z", "u", "w"), class1 = c(10L, 15L, 11L, 17L, 18L), class2 = c(5L, 
3L, 2L, 7L, 7L), class3 = c(7L, 1L, 4L, 3L, 9L)), 
class = "data.frame", row.names = c(NA, -5L))
0 голосов
/ 28 мая 2020

Вы можете создать столбец n_ID со всеми единицами и sum со всеми столбцами 'class'.

library(dplyr)

df %>%
 mutate(n_ID = 1) %>%
 group_by(niv) %>%
 summarise_at(vars(n_ID, starts_with('class')), sum)

# A tibble: 2 x 5
#  niv    n_ID class1 class2 class3
#  <chr> <dbl>  <int>  <int>  <int>
#1 A         3     36     10     12
#2 B         2     35     14     12

данные

df <- structure(list(niv = c("A", "A", "A", "B", "B"), ID = c("x", 
"y", "z", "u", "w"), class1 = c(10L, 15L, 11L, 17L, 18L), class2 = c(5L, 
3L, 2L, 7L, 7L), class3 = c(7L, 1L, 4L, 3L, 9L)), 
class = "data.frame", row.names = c(NA, -5L))
...