1

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 は初めてで、ネイティブ スピーカーではありません。

4

1 に答える 1

0
# Data
set.seed(1)
group1 = c(rep(1,3),rep(2,3),rep(3,3),rep(4,3))
group2 = c("A","B","C","D","B","C","C","B","C","A","B","D")
variable = c(as.integer(rnorm(12,2)**3))
df=data.frame(group1, group2, variable)

前半は――

df$min1 <- sapply(seq(nrow(df)), function(x)
          {
           if(df[x, "group1"] == 1){0} else {
            max(df[x, "group2"] %in% df[df$group1 == df[x,"group1"] - 1,"group2"])}
          })

df$plus1 <- sapply(seq(nrow(df)), function(x)
          {
           if(df[x, "group1"] == max(df$group1){0} else {
            max(df[x, "group2"] %in% df[df$group1 == df[x,"group1"] + 1,"group2"])}
          })

第二部

df$sum_min1 <- sapply(seq(nrow(df)), function(x)
                {
                 if(df[x, "group1"] == 1){0}else{
                  sum(df[df$group1 == df[x,"group1"] & 
                         df$group2 == df[x,"group2"],"variable"],
                      df[df$group1 == df[x,"group1"] - 1 &
                         df$group2 == df[x,"group2"],"variable"])}
                 })
于 2016-12-01T21:59:20.743 に答える