Предположим, у нас есть фрейм данных df
, например
book_id book_category book_word_hi book_word_bye book_word_yes
1 drama 3 0 4
2 action 1 4 5
3 drama 5 3 2
Я хотел бы подсчитать количество значений в столбцах book_word
и суммировать их в таблице для каждого book_category
.
Таким образом, вывод здесь должен выглядеть примерно так:
drama: 17
action: 10
Кто-нибудь знает как это сделать?
Используйте функцию summarise_at
ссылка на документы:
df %>%
summarise_at(c("book_word_hi","book_word_bye","book_word_yes"), sum, na.rm = FALSE)
Также можно комбинировать с group_by
Да, я так думаю. Проверьте документы, на которые я ссылался. Вы можете использовать операторы в стиле выбора, например: summarise_at(vars(book_word_hi:book_word_yes), mean, na.rm = FALSE)
для одновременного выбора множества переменных.
Вы также можете использовать индексацию столбцов. Проверьте этот другой ответ SO: stackoverflow.com/questions/45883513/…
Здесь могут быть и другие столбцы, такие как book_word_foo
, которые будут учитываться:
library(tidyverse)
data <- tribble(
~book_id, ~book_category, ~book_word_hi, ~book_word_bye, ~book_word_yes,
1, "drama", 3, 0, 4,
2, "action", 1, 4, 5,
2, "drama", 5, 3, 2,
)
data %>%
pivot_longer(-c(book_id, book_category)) %>%
group_by(book_category) %>%
summarise(n = sum(value))
#> # A tibble: 2 × 2
#> book_category n
#> <chr> <dbl>
#> 1 action 10
#> 2 drama 17
Created on 2022-05-05 by the reprex package (v2.0.0)
Это короткий и простой однострочный код на основе R, не требующий дополнительных пакетов.
tapply(rowSums(df[3:5]), df[2], sum)
#> book_category
#> action drama
#> 10 17
Сначала просуммируйте все столбцы, которые starts_with
содержат строку «book_word». Затем group_by
и sum
увеличьте значения на book_category
.
library(dplyr)
df %>%
mutate(book_sum = rowSums(across(starts_with("book_word")))) %>%
group_by(book_category) %>%
summarize(sum = sum(book_sum))
# A tibble: 2 × 2
book_category sum
<chr> <int>
1 action 10
2 drama 17
Использование aggregate
из base R
aggregate(book_sum ~ book_category, transform(data, book_sum = rowSums(data[3:5])), sum)
book_category book_sum
1 action 10
2 drama 17
Спасибо. Есть ли способ адаптировать код, используя индекс столбца, а не имя столбца? Например.
c([3:5])
? @Mads