r - 为值的子集创建游程 ID

标签 r dplyr data.table

在这种类型的数据框中:

df <- data.frame(
  x = c(3,3,1,12,2,2,10,10,10,1,5,5,2,2,17,17)
)

如何创建一个新列,仅记录 x 值的子集(例如 3-20)的游程 ID?

我自己的尝试仅在应中断游程计数的位置插入 NA 成功;但在内部看来计数是不间断的:

library(data.table)
df %>%
  mutate(rle = ifelse(x %in% 3:20, rleid(x), NA))
    x rle
1   3   1
2   3   1
3   1  NA
4  12   3
5   2  NA
6   2  NA
7  10   5
8  10   5
9  10   5
10  1  NA
11  5   7
12  5   7
13  2  NA
14  2  NA
15 17   9
16 17   9

预期结果:

    x rle
1   3   1
2   3   1
3   1  NA
4  12   2
5   2  NA
6   2  NA
7  10   3
8  10   3
9  10   3
10  1  NA
11  5   4
12  5   4
13  2  NA
14  2  NA
15 17   5
16 17   5

最佳答案

以 R 为基数:

df[df$x %in% 3:20, "rle"] <- data.table::rleid(df[df$x %in% 3:20, ])

    x rle
1   3   1
2   3   1
3   1  NA
4  12   2
5   2  NA
6   2  NA
7  10   3
8  10   3
9  10   3
10  1  NA
11  5   4
12  5   4
13  2  NA
14  2  NA
15 17   5
16 17   5

使用left_join:

left_join(df, df %>% 
  filter(x %in% 3:20) %>% 
    distinct() %>% 
    mutate(rle = row_number()))

Joining, by = "x"
    x rle
1   3   1
2   3   1
3   1  NA
4  12   2
5   2  NA
6   2  NA
7  10   3
8  10   3
9  10   3
10  1  NA
11  5   4
12  5   4
13  2  NA
14  2  NA
15 17   5
16 17   5

关于r - 为值的子集创建游程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72100697/

相关文章:

R 累积不同计数客户和产品

数据框列中 R 计数值大于零

arrays - r中的2d矩阵到3d堆叠数组

r - 直接使用dplyr突变数据库表中的变量

r - 提取在两个或多个字段中具有重复值但在另一个字段中具有不同值的行

r - cbind 有效地从多个 data.tables 中绑定(bind)特定列

r - 在气泡图中包含 NA 的频率

Perl Statistics::R 生成空白绘图图像 (jpeg)

r - 将逻辑运算符与 %in% 和子集一起使用

r - 有没有更好的方法将向量的每个元素与一组定义的间隔相匹配?