计算行之间的行数

时间:2018-06-17 11:54:58

标签: r dplyr

我有一个包含四列的数据框: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

2 个答案:

答案 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