Данные панели - сумма по группам и создание новой переменной

Я знаю, что уже есть много вопросов по "сумме по группам", однако я не решаю свою проблему. Вот:

df1 - мой упрощенный набор данных

> df1 = data.table( Year = c(2009,2009,2009,2009,2009,2009,2009,2009,2010,2010,2010,2010),
                  ID = c(1621, 1621, 1628,1628,3101, 3101,3105,3105,1621, 1621, 1628,1628 ), 
                  category= c("0910","0910","0911","0913", "0914", "0910","0910","0911","1014","1012","1011","1013"),
                  var1 = c(60,70, 400,300,15,20, 200,150,61,71,401,301) )

df2 - желаемый результат (см. var2):

> df2 = data.table( Year = c(2009,2009,2009,2009,2009,2009,2009,2009,2010,2010,2010,2010),
                  ID = c(1621, 1621, 1628,1628,3101, 3101,3105,3105,1621, 1621, 1628,1628 ), 
                  category= c("0910","0910","0911","0913", "0914", "0910","0910","0911","1014","1012","1011","1013"),
                  var1 = c(60,70, 400,300,15,20, 200,150,61,71,401,301), 
                  var2= c(130,130,700,700,35,35,350,350,132,132,702,702) )

Поэтому я хотел бы рассчитать суммы var1 сгруппированы по ID и первые два целых числа category

Таким образом, если первые два целых числа переменной категории равны 09 (или 10 и т. Д.), Тогда присвойте var2 сумма по группам ID и первые два целых числа category, Затем равные идентификаторы в одной и той же категории должны получить одинаковую сумму.

Я пытался достичь этого путем

> df1$var2 = rep(NA, rep(length(df1$ID)))
df1$var2 = ifelse(substr(df1$category,1,2)=="09", by(df1[Year==2009,]$var1, df1[Year==2009,]$ID,sum), df1$var2)
df1$Var2 = ifelse(substr(df1$category,1,2)=="10", by(df1[Year==2010,]$var1, df1[Year==2010,]$ID,sum), df1$var1)

Но здесь суммы не назначены для правильного пункта.

Может ли кто-нибудь помочь мне?

1 ответ

Решение
df1 = data.frame( Year = c(2009,2009,2009,2009,2009,2009,2009,2009,2010,2010,2010,2010),
                  ID = c(1621, 1621, 1628,1628,3101, 3101,3105,3105,1621, 1621, 1628,1628 ), 
                  category= c("0910",NA,"0911","0913", "0914", "0910","0910",NA,"1014","1012",NA,"1013"),
                  var1 = c(60,70, 400,300,15,20, 200,150,61,71,401,301) )

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

df1$category_sub = substr(df1$category, 1, 2)
df1_aggre = aggregate(var1 ~ ID + category_sub, data = df1, sum)
names(df1_aggre)[3] = "var2"

df2 = merge(df1, df1_aggre, all=TRUE)
df2[order(df2$Year),]

Результат:

> df2[order(df2$Year),]
     ID category_sub Year category var1 var2
1  1621           09 2009     0910   60   60
4  1621         <NA> 2009     <NA>   70   NA
5  1628           09 2009     0911  400  700
6  1628           09 2009     0913  300  700
9  3101           09 2009     0914   15   35
10 3101           09 2009     0910   20   35
11 3105           09 2009     0910  200  200
12 3105         <NA> 2009     <NA>  150   NA
2  1621           10 2010     1014   61  132
3  1621           10 2010     1012   71  132
7  1628           10 2010     1013  301  301
8  1628         <NA> 2010     <NA>  401   NA

Сначала я извлек первые два целых числа из category и сгруппированы var1 от ID а также category_sub, Я тогда переименовал var1 в var2 и слились df1 а также df1_aggre от ID а также category_sub с all=TRUE вариант. Это указывает на полное внешнее соединение. Полученный кадр данных не был отсортирован, поэтому я отсортировал df2 от Year чтобы получить желаемый результат.

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