3

我需要为特定条件创建一个 id 序列:flag==1,我的问题的一个例子是:

library(dplyr)
set.seed(123)
a <- data.frame(id = 1:10,
                flag = rbinom(10,1,0.2))
print(a)

   id flag
1   1    0
2   2    0
3   3    0
4   4    1
5   5    1
6   6    0
7   7    0
8   8    1
9   9    0
10 10    0

我尝试仅为 flag==1 创建一个 id 变量,但可悲的是还标识了 flag==0,我的命令结果和期望结果的示例是:

a %>%
mutate(try_seq = cumsum(c(TRUE, diff(flag) != 0)))

>  id flag try_seq desire_seq
1   1    0       1      NA
2   2    0       1      NA    
3   3    0       1      NA
4   4    1       2      1
5   5    1       2      1
6   6    0       3      NA
7   7    0       3      NA
8   8    1       4      2
9   9    0       5      NA
10 10    0       5      NA
10 10    0       5      NA
4

3 回答 3

1

这将返回您正在寻找的结果:

cumsum(c(a$flag[1], diff(a$flag)) > 0) * NA^!a$flag
 [1] NA NA NA  1  1 NA NA  2 NA NA

NA^a$flag技巧使用的想法是任何值的 0 次方都是 1。否则,我们使用diff检查变量的正变化。

于 2019-04-15T00:27:22.530 回答
0

我们也可以rle不使用任何ifelse

library(dplyr)
na_if(inverse.rle(within.list(rle(a$flag), {
    i1 <- as.logical(values)
    values[i1] <- seq_along(values[i1])} )), 0)
#[1] NA NA NA  1  1 NA NA  2 NA NA

或使用data.table

library(data.table)
setDT(a)[, grp := rleid(flag)][flag != 0, desire_seq := .GRP , grp][, grp := NULL][]
#    id flag desire_seq
# 1:  1    0         NA
# 2:  2    0         NA
# 3:  3    0         NA
# 4:  4    1          1
# 5:  5    1          1
# 6:  6    0         NA
# 7:  7    0         NA
# 8:  8    1          2
# 9:  9    0         NA
#10: 10    0         NA
于 2019-04-15T06:25:03.750 回答
0

我们可以使用rle为每个 1 创建一个序列并将其更改为NAelse

library(dplyr)

a %>%
  mutate(ans_seq = ifelse(flag == 1, with(rle(flag == 1), 
                         rep(cumsum(!values), lengths)), NA))


#   id flag ans_seq
#1   1    0      NA
#2   2    0      NA
#3   3    0      NA
#4   4    1       1
#5   5    1       1
#6   6    0      NA
#7   7    0      NA
#8   8    1       2
#9   9    0      NA
#10 10    0      NA

也可以仅使用基数 R 编写为

with(a, ifelse(flag == 1, with(rle(flag == 1), rep(cumsum(!values), lengths)), NA))
#[1] NA NA NA  1  1 NA NA  2 NA NA
于 2019-04-15T00:27:50.810 回答