Создайте переменную в R, которая указывает, суммируются ли числовые строки подгрупп с итоговыми строками по группам.

Я хотел бы иметь возможность создать логическую переменную, которая указывает для конкретной категории, суммируются ли подсчеты набора строк подгруппы (т. е. A, B, C в переменной «группа») с тем же значением, что и мой «Все» / общие строки группы.

Мои данные выглядят так:

group = c("All", "A", "B", "C", "All", "A", "B", "C")
category = c("music", "music", "music", "music", "movies", "movies", "movies", "movies")
count = c(120, 15, 75, 30, 250, 36, 28, 72)

data <- data.frame(cbind(group, category, count))

Я бы хотел добавить столбец sum_to_all, например:

sum_to_all = c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE)

data <- data.frame(cbind(group, category, count, sum_to_all))

В этом случае подгруппы переменных счета A, B и C суммируются с количеством в группе «Все» (ИСТИНА) для музыкальной категории, но не для категории фильмов (ЛОЖЬ).

Я знаю, что могу изменить набор данных на широкий, в котором каждая группа будет иметь свой собственный столбец подсчета и сравнивать столбцы, но мне интересно, есть ли простое решение для строк. Заранее спасибо.


person mkpcr    schedule 04.05.2021    source источник
comment
Кроме того, data.frame(cbind(group, category, count)) преобразует все ваши числа в текст из-за cbind, который делает matrix первым. Вы можете пропустить эту часть и просто сделать data.frame(group, category, count)   -  person thelatemail    schedule 05.05.2021


Ответы (1)


Мы можем сгруппировать по «категории» и создать «сумму_ко_всем», сравнивая sum из «количества», не включая первое наблюдение, с first наблюдением.

library(dplyr)
data %>%
    group_by(category) %>%
    mutate(sum_to_all = sum(count[-1]) == first(count)) %>%
    ungroup

-выход

# A tibble: 8 x 4
#  group category count sum_to_all
#  <chr> <chr>    <dbl> <lgl>     
#1 All   music      120 TRUE      
#2 A     music       15 TRUE      
#3 B     music       75 TRUE      
#4 C     music       30 TRUE      
#5 All   movies     250 FALSE     
#6 A     movies      36 FALSE     
#7 B     movies      28 FALSE     
#8 C     movies      72 FALSE  

ПРИМЕЧАНИЕ. Здесь мы предполагаем, что группа «Все» является элементом first. Если это не всегда так, сделайте либо arrange, либо подмножество с ==

data %>%
    group_by(category) %>%
    mutate(sum_to_all = sum(count[group != 'All']) ==count[group == 'All']) %>%
    ungroup

данные

data <- data.frame(group, category, count)
person akrun    schedule 04.05.2021
comment
Спасибо. Если бы мне потребовалась только сумма групп A и B для этого сравнения, знаете ли вы, как я мог бы исключить и все, и C? - person mkpcr; 05.05.2021
comment
@mkpcr В этом случае вы можете использовать [! group %in% c("All", "C")] и [group %in% c("All", "C")] для замены во втором решении. - person akrun; 05.05.2021