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