Строка на основе групп или условий в г

Я хочу сделать RumSum в R на основе имен столбцов.

У меня есть более 50 столбцов и я посмотрел на различные решения, в том числе это.

Тем не менее, это не совсем отвечает на мой вопрос. У меня есть имена столбцов, такие как: total_2012Q1, total_2012Q2, total_2012Q3, total_2012Q4,..., вплоть до total_2014Q4и другие символьные переменные. Я хочу добавить строки по годам, так что в итоге у меня будет три года столбцов: total_2012, total_2013, total_2014,

Я не хочу RumSum и выбрать что-то вроде..sample[,2:5], Есть ли способ суммировать их, не просматривая номера столбцов вручную? Кроме того, split.default является опцией, но если есть также символьные переменные, как вы обрабатываете только переменные типа int, которые хотите суммировать?

Простой воспроизводимый пример (предварительно):

id total_2012Q1 total_2012Q2 total_2013Q1 total_2013Q2 char1 char2
 1         1231         5455         1534         2436    N     Y
 2         3948         1239          223          994    Y     N

Воспроизводимый пример (пост):

id total_2012 total_2013 char1 char2
 1       6686      3970     N     Y
 2       5187      1217     Y     N

Спасибо за любые предложения.

2 ответа

Решение

Ты можешь использовать split.defaultт.е.

sapply(split.default(df, sub('^.*_([0-9]+)Q[0-9]', '\\1', names(df))), rowSums)
#     2012 2013
#[1,]    3   23
#[2,]    7   37
#[3,]    9   49

ДАННЫЕ:

dput(df)
structure(list(total_2012Q1 = c(1, 2, 3), total_2012Q2 = c(2, 
5, 6), total_2013Q1 = c(12, 15, 16), total_2013Q2 = c(11, 22, 
33)), class = "data.frame", row.names = c(NA, -3L))

То, как я хотел бы подойти к этому с tidyverse функции состоит в том, чтобы преобразовать данные в длинный формат, чтобы у вас есть столбец total_2012Q1, total_2012Q2и т. д. Затем можно разделить это на годы и кварталы, где кварталы помечаются как последние два символа в каждой строке:

library(dplyr)
library(tidyr)

df %>%
  gather(key, value, starts_with("total")) %>%
  separate(key, into = c("year", "quarter"), sep = -2)
#> # A tibble: 8 x 6
#>      id char1 char2 year       quarter value
#>   <dbl> <chr> <chr> <chr>      <chr>   <dbl>
#> 1     1 N     Y     total_2012 Q1       1231
#> 2     2 Y     N     total_2012 Q1       3948
#> 3     1 N     Y     total_2012 Q2       5455
#> 4     2 Y     N     total_2012 Q2       1239
#> 5     1 N     Y     total_2013 Q1       1534
#> 6     2 Y     N     total_2013 Q1        223
#> 7     1 N     Y     total_2013 Q2       2436
#> 8     2 Y     N     total_2013 Q2        994

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

df %>%
  gather(key, value, starts_with("total")) %>%
  separate(key, into = c("year", "quarter"), sep = -2) %>%
  group_by_at(vars(id:year)) %>%
  summarise(value = sum(value)) %>%
  spread(key = year, value = value)
#> # A tibble: 2 x 5
#> # Groups:   id, char1, char2 [2]
#>      id char1 char2 total_2012 total_2013
#>   <dbl> <chr> <chr>      <dbl>      <dbl>
#> 1     1 N     Y           6686       3970
#> 2     2 Y     N           5187       1217

Такой подход, особенно с starts_with("total") вместо жестко заданных имен столбцов или позиций столбцов, вы можете масштабировать до больших наборов данных с большим количеством столбцов.

Другие вопросы по тегам