Как суммировать значения в строках с целевыми значениями в двух столбцах? - PullRequest
0 голосов
/ 25 октября 2018

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

Пример: я быхотел бы суммировать значения a, b, c для 2015 года, чтобы создать новую категорию «e», и сделать то же самое для 2016 года.

Year Category Value
2015 a        2
2015 b        3
2015 c        2
2015 d        1
2016 a        7
2016 b        2
2016 c        1
2016 d        1

Чтобы получить что-то вроде этого:

Year Category Value
2015 d        1
2015 e        7
2016 d        1
2016 e        10

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вот более компактный dplyr вариант

dat %>%
        mutate(Category = ifelse(Category %in% c("a", "b", "c"), "e", # put in c() the Categories you want to sum
                                 as.character(Category))) %>%
        group_by(Year, Category) %>%
        summarise(Value = sum(Value))
# A tibble: 4 x 3
# Groups:   Year [?]
   Year Category Value
  <int>    <chr> <int>
1  2015        d     1
2  2015        e     7
3  2016        d     1
4  2016        e    10
0 голосов
/ 25 октября 2018

Попробуйте aggregate, определив сначала группу категорий.

target <- c("a", "b", "c")
group <- factor(dat$Category %in% target,
                levels = c(TRUE, FALSE),
                labels = c("e", "d"))
agg <- aggregate(Value ~ group + Year, dat, sum)[c(2, 1, 3)]

agg
#  Year group Value
#1 2015     e     7
#2 2015     d     1
#3 2016     e    10
#4 2016     d     1

Правка.

Если у вас много категорий и вы хотите свернуть некоторые из нихоставляя остальных без изменений, пакет CRAN forcats function fct_collapse является хорошим способом сделать это.

group <- forcats::fct_collapse(dat$Category,
                      "e" = target)
group
#[1] e e e d e e e d
#Levels: e d

Затем aggregate, как указано выше.

Данные.

dat <-
structure(list(Year = c(2015L, 2015L, 2015L, 2015L, 2016L, 2016L, 
2016L, 2016L), Category = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 
3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), Value = c(2L, 
3L, 2L, 1L, 7L, 2L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
-8L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...