r

时间:2017-01-25 14:33:13

标签: r dataframe

我有这个数据框如下所示。 数据框有一列A作为user_ID,B是电子邮件的标准,其中1表示SendSuccess,2表示电子邮件已被读取,C是B的二进制对应物。 数据框按A和B

排序

我想要一个列D来计算每个用户读取电子邮件的次数,所以基本上将C中的值添加到D的前一个值,但如果C为0则D也为0 如果C(1)= 0则D(1)= 0否则D(1)= 1,如果C(2)= 0则D(2)= 0否则D(2)= 1 + D(1),如果C(3)= 0然后D(3)= 0否则D(3)= 1 + D(2),依此类推。其中(1)(2)表示行号

然后我想要E列,它将发送电子邮件与第一次阅读时结合起来。 如果D(2)= 1则E计算,则E(1)= 1否则如果D(1)= 1则E(1)= 1否则0

最后我想要的是F列,它只是特定邮件被读取次数的最大分组

DF <- data.frame(A=c(1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4), B=c(1,1,2,2,2,1,1,2,2,1,1,1,2,2,1,1,1,2,1,1), C=c(0,0,1,1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1))
DF
    A  B   C   Want_D  Want_E  Want_F
 1: 1  1   0        0       0       0
 2: 2  1   0        0       1       0
 3: 2  2   1        1       1       3
 4: 2  2   1        2       0       3
 5: 2  2   1        3       0       3
 6: 2  1   0        0       0       0
 7: 2  1   0        0       1       0
 8: 2  2   1        1       1       2
 9: 2  2   1        2       0       2
10: 3  1   0        0       0       0
11: 3  1   0        0       0       0
12: 3  1   0        0       1       0
13: 3  2   1        1       1       2
14: 3  2   1        2       0       2
15: 3  1   0        0       0       0
16: 3  1   0        0       0       0
17: 4  1   0        0       1       0
18: 4  2   1        1       1       1
19: 4  1   0        0       0       0
20: 4  1   0        0       0       0

2 个答案:

答案 0 :(得分:3)

library(dplyr)
DF %>% 
  group_by(A) %>% 
  mutate(email = cumsum(C == 0)) %>% 
  group_by(A, email) %>%
  mutate(
    D = cumsum(C), 
    E = as.numeric(lead(D, default = 0) == 1 | D == 1)
  ) %>% 
  group_by(A, email, C) %>% 
  mutate(`F` = max(D)) %>% 
  ungroup()
# # A tibble: 20 × 7
#        A     B     C email     D     E     F
#    <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
# 1      1     1     0     1     0     0     0
# 2      2     1     0     1     0     1     0
# 3      2     2     1     1     1     1     3
# 4      2     2     1     1     2     0     3
# 5      2     2     1     1     3     0     3
# 6      2     1     0     2     0     0     0
# 7      2     1     0     3     0     1     0
# 8      2     2     1     3     1     1     2
# 9      2     2     1     3     2     0     2
# 10     3     1     0     1     0     0     0
# 11     3     1     0     2     0     0     0
# 12     3     1     0     3     0     1     0
# 13     3     2     1     3     1     1     2
# 14     3     2     1     3     2     0     2
# 15     3     1     0     4     0     0     0
# 16     3     1     0     5     0     0     0
# 17     4     1     0     1     0     1     0
# 18     4     2     1     1     1     1     1
# 19     4     1     0     2     0     0     0
# 20     4     1     0     3     0     0     0

答案 1 :(得分:0)

使用for循环的解决方案:

DF$D <- c(DF$C[1], rep(0, nrow(DF)-1))
for (i in 2:nrow(DF))
  if (DF$C[i] != 0){
  DF$D[i] <- DF$D[i-1]+1
    }

DF$E <- rep(0, nrow(DF))
DF$E[c(which(DF$D == 1), which(DF$D == 1)-1)] <- 1

x <- rle(DF$C)
x$values <- x$lengths * x$values
DF$F <- rep(x$values, x$lengths)