2017-08-25 5 views
0

「グループ別合計」には既に多くの質問がありますが、私は自分の問題を解決できません。ここでは、次のとおりです。パネルデータ - グループ別に集計し、新しい変数を作成する

> 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の合計を計算したいと思います:

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を参照)が所望の結果である設定ですIDと最初の2つの整数category

したがって、変数カテゴリの最初の2つの整数が09(または10 d soなど)、グループIDcategoryの最初の2つの整数による合計をvar2に割り当てます。同じカテゴリーの同じIDに同じ合計を割り当てる必要があります。

私は

> 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) 

によってこれをachievしようとしましたが、ここで和が正しい項目に割り当てられていません。

誰かが私を助けてくれますか?

+2

しばらく時間をかけてコードをフォーマットしてください。 – lmo

+0

あなたはコードとCtrl + Kを強調表示することでこれを行うことができます – useR

答えて

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)) 

OPの元のデータフレームにNA値を追加して、彼が望む完全な仕様を反映させました。

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 

Iは、第categoryから最初の2つの整数を抽出しIDcategory_subによってvar1をグループ化。 var1var2にリネームし、df1df1_aggreIDcategory_suball=TRUEオプションをマージしました。これは完全な外部結合を指定します。結果のデータフレームはソートされていませんでしたので、df2Yearでソートして、目的の結果を得ました。

+0

categroy(substr(category、1,2)とYear以外の整数の最初のものを取る必要がある場合はどうすれば問題に対処しますか? – Enrico

+0

@Enrico – useR

+0

これは私がここには含まれていなかったいくつかの理由のためです:いくつかのIDはカテゴリに値がありません。これらは合計から除外されるべきです。私は簡略化されたデータセットdf1に包まれていませんでした。 – Enrico

関連する問題