Упорядочивание group_by, mutate и summarize в R

Фрейм данных df имеет три столбца: x, y и n. Я хочу создать новый фрейм данных, который группируется по x, подсчитывает количество наблюдений в y для этой группы x, а затем суммирует значения для этой группы в n.

df <- structure(list(x = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 
5, 5), y = c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 1, 2, 1, 2, 3), 
n = c(4L, 3L, 2L, 3L, 2L, 4L, 2L, 2L, 3L, 3L, 2L, 5L, 3L, 
3L, 2L, 3L)), class = "data.frame", row.names = c(NA, -16L))

Целевой фрейм данных выглядит так, где a - это 5 групп из исходного df:

> print(df2, row.names=FALSE)
 a b  c
 1 4 12
 2 3  8
 3 4 10
 4 2  8
 5 3  8

По какой-то причине я не комбинирую инструкции group_by, mutate или summarize в конвейере в правильном порядке, чтобы это произошло. Это похоже на простое решение, которого я сейчас не вижу. Если бы кто-нибудь мог помочь, я был бы признателен.


person mysteRious    schedule 24.12.2020    source источник


Ответы (3)


Попробуй это:

library(dplyr)
library(tidyr)
#Code
new <- df %>% group_by(x) %>%
  summarise(b=n(),c=sum(n,na.rm=T))

Выход:

# A tibble: 5 x 3
      x     b     c
  <dbl> <int> <int>
1     1     4    12
2     2     3     8
3     3     4    10
4     4     2     8
5     5     3     8
person Duck    schedule 24.12.2020
comment
@ThomasIsCoding Да, dplyr крутой, и вопрос вне темы, как только я увидел, что вы из Швеции, теперь я вижу, что вы в Нью-Йорке, поздравляю, если у вас появилась новая работа :) - person Duck; 24.12.2020
comment
Хаха спасибо! У меня была короткая поездка в Нью-Йорк, а теперь обратно в Швецию :) - person ThomasIsCoding; 24.12.2020

Вот вариант data.table

> setDT(df)[, .(b = .N, c = sum(n)), x]
   x b  c
1: 1 4 12
2: 2 3  8
3: 3 4 10
4: 4 2  8
5: 5 3  8
person ThomasIsCoding    schedule 24.12.2020

С base R мы можем сделать

do.call(rbind, by(df, df$x, FUN = function(x) 
     data.frame(b = length(x), c = sum(x$n, na.rm = TRUE))))
person akrun    schedule 24.12.2020