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