group1、group2、および変数の3つの列を持つdfがあるとします
set.seed(1)
group1 = c(rep(1,5),rep(2,5),rep(3,5),rep(4,5))
group2 = c("A","B","C","D","B","C","C","B","C","A","B","D")
variable = c(as.integer(rnorm(20,2)**3))
df=data.frame(group1, group2, variable)
「group1」内の b の値が group1(x-1) にも存在するかどうかを示す列「min1」を追加しました。plus1 でその逆。合計データ フレームの下:
group1 group2 variable min1 plus1
1 1 A 3 0 0
2 1 B 11 0 1
3 1 C 2 0 1
4 2 D 47 0 1
5 2 B 13 1 1
6 2 C 2 1 1
7 3 C 16 1 0
8 3 B 21 1 1
9 3 C 18 1 0
10 4 A 5 0 0
11 4 B 44 1 0
12 4 D 14 0 0
ここで、変数に対して max() や sum() (さらにいくつかのエキゾチックなもの) などの計算を実行したいのですが、独自の group1 と group2 の組み合わせ内のすべての値だけでなく、前のグループの値を含めます (またはその後)。min1 の例を以下に示します。
group1_min1 group2_min1 sum_min1 max_min1
1 2 B 24 13
2 2 C 4 2
3 3 C 36 18
4 3 B 34 21
5 4 B 65 44
group1_min1(3)、group2_min1(C) には、行 6、7、9 (2、16、18) の 3 つの値が使用されることに注意してください。
group_by を使用してみて、dplyr 内で要約すると、次のようになります。
group_by(group1, group2) %>%
summarize_each(funs(sum, max))
編集:
元の df に合計を追加する解決策を見つけました。
sum_min1 = c()
j=0
for (j in 1:(length(df$group1))){
if (df[j,"min1"] == 0){sum_min1 = c(sum_min1,0)} else {
sum_min1 = c(sum_min1,(sum(df[which((df[,"group1"] == df[j,"group1"] | df[,"group1"] == (df[j,"group1"]-1)) & df[,"group2"]==(df[j,"group2"])),"variable"])))
}
}
df = cbind(df,sum_min1)
これにより、次の出力が得られます。
group1 group2 variable min1 plus1 sum_min1
1 1 A 3 0 0 0
2 1 B 11 0 1 0
3 1 C 2 0 1 0
4 2 D 47 0 0 0
5 2 B 13 1 1 24
6 2 C 2 1 1 4
7 3 C 16 1 0 36
8 3 B 21 1 1 34
9 3 C 18 1 0 36
10 4 A 5 0 0 0
11 4 B 44 1 0 65
12 4 D 14 0 0 0
ただし、これは非常に大まかな方法のようで、大きなデータセットでは時間がかかる場合があります。また、実際には複数の変数と複数の関数があります。また、すべての値の for ループを含むいくつかのユーザー定義関数を実行したいので、問題になる可能性があります。
これを行うよりエレガントな方法はありますか?
R と StackOverflow は初めてで、ネイティブ スピーカーではありません。