Rowsum, основанная на группировках или условиях в r - PullRequest
0 голосов
/ 20 декабря 2018

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

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

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

Я не хочу и выбирать что-то вроде .. sample[,2:5].Есть ли способ суммировать их, не просматривая номера столбцов вручную?Кроме того, является опцией, но если есть также символьные переменные, как вы обрабатываете только те переменные типа 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 ]

0 голосов
/ 20 декабря 2018

Я бы подошел к этому с помощью функций 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") вместо жестко заданных имен столбцов или позиций столбцов, позволяет масштабировать данные до больших наборов данных с большим количеством столбцов.

0 голосов
/ 20 декабря 2018

Вы можете использовать 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))
...