我有一个包含四列的数据框:user_id,event和time
User_id是user_id,事件是“A”或“B”,时间是时间。我需要计算每个“A”值之前出现的“B”值的数量。因此,如果在第一个“A”之前有3个“B”值,那么“A”的实例将获得一个值为3的新列。如果在下一个值之前有25个“B”实例一个“然后将得到25的价值。我认为自己是一个坚实的R / dplyr熟练工,但这让我感到难过!感谢。
user_id event date_time desired_column
1 B 2018-01-01 NA
1 B 2018-01-02 NA
1 B 2018-01-03 NA
1 B 2018-01-04 NA
1 B 2018-01-05 NA
1 A 2018-01-06 5
1 B 2018-01-07 NA
1 A 2018-01-08 1
2 B 2018-01-05 NA
2 B 2018-01-06 NA
2 A 2018-01-07 2
2 B ... NA
2 A ... 1
答案 0 :(得分:3)
x <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
user_id event date_time desired_column
1 B 2018-01-01 NA
1 B 2018-01-02 NA
1 B 2018-01-03 NA
1 B 2018-01-04 NA
1 B 2018-01-05 NA
1 A 2018-01-06 5
1 B 2018-01-07 NA
1 A 2018-01-08 1
2 B 2018-01-05 NA
2 B 2018-01-06 NA
2 A 2018-01-07 2')
也许有点笨重但是......
(修改:指定dplyr::lag
,因为stats::lag
无法满足我们的需求。)
x$a <- NA
x$a[cumsum(rle(x$event)$lengths)] <- rle(x$event)$lengths
x$a <- dplyr::lag(x$a)
x$a[x$event == "B"] <- NA
x
# user_id event date_time desired_column a
# 1 1 B 2018-01-01 NA NA
# 2 1 B 2018-01-02 NA NA
# 3 1 B 2018-01-03 NA NA
# 4 1 B 2018-01-04 NA NA
# 5 1 B 2018-01-05 NA NA
# 6 1 A 2018-01-06 5 5
# 7 1 B 2018-01-07 NA NA
# 8 1 A 2018-01-08 1 1
# 9 2 B 2018-01-05 NA NA
# 10 2 B 2018-01-06 NA NA
# 11 2 A 2018-01-07 2 2
答案 1 :(得分:3)
使用@ r2Evans&#39;数据:
x$y <- NA
which_ <- which(x$event=="A")
x$y[which_] <- diff(c(0,which_))-1
# user_id event date_time desired_column y
# 1 1 B 2018-01-01 NA NA
# 2 1 B 2018-01-02 NA NA
# 3 1 B 2018-01-03 NA NA
# 4 1 B 2018-01-04 NA NA
# 5 1 B 2018-01-05 NA NA
# 6 1 A 2018-01-06 5 5
# 7 1 B 2018-01-07 NA NA
# 8 1 A 2018-01-08 1 1
# 9 2 B 2018-01-05 NA NA
# 10 2 B 2018-01-06 NA NA
# 11 2 A 2018-01-07 2 2