0

私の(サンプル)データは次のようになります。

mydata <- structure(list(x1 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), x2 = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 4L, 4L), x3 = c(1L, 3L, 5L, 1L, 3L, 5L, 1L, 4L, 5L, 2L, 
1L, 5L, 6L, 6L), week = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 30L, 50L, 
22L, 52L, 36L, 25L, 26L), newar1 = c(0L, 0L, 2L, 0L, 0L, 2L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), newvar2 = c(0L, 2L, 0L, 0L, 
2L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("x1", "x2", 
"x3", "week", "newar1", "newvar2"), class = "data.frame", row.names = c(NA, 
-14L))



x1  x2  x3  week
0   1   1   0
0   2   3   0
0   3   5   0
0   1   1   0
0   2   3   0
0   3   5   0
1   1   1   1
1   2   4   30
1   3   5   50
1   1   2   22
1   2   1   52
1   3   5   36
1   4   6   25
1   4   6   26

1 つの新しい変数を作成したいと思いますnewvar1

  • if x1 = 0 => データセット全体で x1 が 1 に等しい回数をカウントしたいのですが (自分の観測を除く他の行のみ)、x2 と x3 の同じ組み合わせの行と、週番号が 24 を超えています。

  • if x1 = 1 => データセット全体で x1 が 1 に等しい回数をカウントしたいのですが、x2 と x3 の同じ組み合わせの行と、週数から 25 を引いた値がゼロより大きい行のみをカウントします ((週-25)>0))。

「合計」とは、条件が満たされた場合に x1 が 1 に等しい回数を意味します。

「if」とは、if に続く条件が成立する場合にのみ x1 を合計したいという意味です。基本的に私の質問は、条件に基づいて特定の値のみを合計するにはどうすればよいですか?

私のデータは次のようになります。

x1  x2  x3  week newvar1
0   1   1   0    0       
0   2   3   0    0       
0   3   5   0    2       
0   1   1   0    0       
0   2   3   0    0       
0   3   5   0    2       
1   1   1   1    0       
1   2   4   30   0       
1   3   5   50   1       
1   1   2   22   0       
1   2   1   52   0       
1   3   5   36   0       
1   4   6   25   0       
1   4   6   26   1       

x2=x3現在、次のコードがありますが、これは週の制約を考慮していません。これを行う方法について何か提案はありますか?

mydata[,newvar1:=sum(x1), by=list(x2,x3)]
4

3 に答える 3

0

使用dplyr:

library(dplyr)
mydata %>% group_by(x2, x3) %>%
    mutate(newvar1 = ifelse(x1 == 0,
                            sum(x1 * week > 24),
                            sum(x1 * week > 25) - (week > 25) * (x1 == 1)))
# Source: local data frame [14 x 6]
# Groups: x2, x3 [7]
# 
#       x1    x2    x3  week newvar2 newvar1
#    <int> <int> <int> <int>   <int>   <int>
# 1      0     1     1     0       0       0
# 2      0     2     3     0       2       0
# 3      0     3     5     0       0       2
# 4      0     1     1     0       0       0
# 5      0     2     3     0       2       0
# 6      0     3     5     0       0       2
# 7      1     1     1     1       0       0
# 8      1     2     4    30       0       0
# 9      1     3     5    50       1       1
# 10     1     1     2    22       0       0
# 11     1     2     1    52       0       0
# 12     1     3     5    36       0       1
# 13     1     4     6    25       0       1
# 14     1     4     6    26       0       0

else条件の奇妙なビットは、- (week > 25) * (x1 == 1)それ以外の場合はそれ自体に一致する行から 1 を減算することです。

于 2016-08-17T21:14:43.300 に答える
0
mydata$newvar1 <- ifelse(mydata$x1==0, sapply(seq_len(nrow(mydata)), function(i) with (mydata, sum(x1[week > 25 & x2==x2[i] & x3==x3[i]]))), 0)
mydata$newvar1 <- ifelse(mydata$x1==1, sapply(seq_len(nrow(mydata)), function(i) with (mydata, sum(x1[week < week[i] & week[i]!=0 & week-week[i]<25 & x2==x2[i] & x3==x3[i]]))), mydata$newvar1)
于 2016-08-17T21:09:45.573 に答える