#r #dplyr
#r #dplyr
Вопрос:
Фрейм данных 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
or mutate
или summarize
or в канале в правильном порядке, чтобы это произошло. Похоже, что это простое решение, которого я сейчас не вижу. Если кто-нибудь может помочь, я был бы признателен.
Ответ №1:
Вот 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
Ответ №2:
Попробуйте это:
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
Комментарии:
1. @ThomasIsCoding Да, dplyr — это круто, и не по теме, как только я увидел, что вы живете в Швеции, теперь я вижу, что вы в Нью-Йорке, поздравляю, если вы получили новую работу 🙂
2. Ха-ха, спасибо тебе! У меня только что была короткая поездка в Нью-Йорк, но теперь я возвращаюсь в Швецию 🙂
Ответ №3:
С base R
помощью мы можем сделать
do.call(rbind, by(df, df$x, FUN = function(x)
data.frame(b = length(x), c = sum(x$n, na.rm = TRUE))))