【发布时间】:2021-08-01 11:22:36
【问题描述】:
我有一个向量Blinks,其值为0 或1:
df <- data.frame(
Blinks = c(0,0,1,1,1,0,0,1,1,1,1,0,0,1,1)
)
我想为Blinks == 1 插入一个分组变量。我为此使用rleid,但分组似乎在Blinks == 0:
library(dplyr)
library(data.table)
df %>%
mutate(Blinks_grp = ifelse(Blinks > 0, rleid(Blinks), Blinks))
Blinks Blinks_grp
1 0 0
2 0 0
3 1 2
4 1 2
5 1 2
6 0 0
7 0 0
8 1 4
9 1 4
10 1 4
11 1 4
12 0 0
13 0 0
14 1 6
15 1 6
我怎样才能得到正确的结果:
1 0 0
2 0 0
3 1 1
4 1 1
5 1 1
6 0 0
7 0 0
8 1 2
9 1 2
10 1 2
11 1 2
12 0 0
13 0 0
14 1 3
15 1 3
【问题讨论】:
-
如果
Blinks是二进制的,rleid(Blinks)/2不会解决问题吗? [去检查...]是的,它会的。 -
@Limey ...不过不是很笼统,
rleid(c(1, 1, 0, 0, 1, 1)) / 2 -
@Henrik。真的。包装在
ceiling()中会处理目标值在向量的第一个元素中的情况。因此,对于x <- c(1, 1, 0, 0, 1, 1),就像在您的反例中一样,ceiling(ifelse(x > 0, rleid(x)/2, x))简洁地给出了所需的结果,而不会更改 OP 用例的结果。 -
确实!或者更紧凑的
ceiling(rleid(x) * x / 2)。干杯