我有这个数据框如下所示。 数据框有一列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
答案 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)