r语言 - 为非零值的运行创建组 ID



我想在向量中找到非零元素的连续运行(至少用一个零分隔(,并为每个组(后续整数(分配一个 ID。

玩具矢量:

value <- c(1, 1, 2, 3, 4, 3, 0, 0, 0, 1, 2, 3, 9, 8, 0, 0, 3, 2)

在此示例中,有三组非零值:[1,1,2,3,4,3]、[1,2,3,9,8]、[3,2],由一个或多个零的块分隔。

每个非零运行都应具有唯一的 ID:1、2、3...零的运行应NA为 ID:

   value id
1      1  1
2      1  1
3      2  1
4      3  1
5      4  1
6      3  1
7      0 NA
8      0 NA
9      0 NA
10     1  2
11     2  2
12     3  2
13     9  2
14     8  2
15     0 NA
16     0 NA
17     3  3
18     2  3

你可以试试:

as.integer(factor(cumsum(value==0)*NA^(value==0)))
#[1]  1  1  1  1  1  1 NA NA NA  2  2  2  2  2 NA NA  3  3

使用 rle() .首先创建一个用 NA 替换零的新向量。

x <- match(value != 0, TRUE)
with(rle(!is.na(x)), {
    lv <- lengths[values]
    replace(x, !is.na(x), rep(seq_along(lv), lv))
})
# [1]  1  1  1  1  1  1 NA NA NA  2  2  2  2  2 NA NA  3  3

你也可以这样做:

id <- (value>0)^NA
x <- rle(value>0)$lengths[c(TRUE, FALSE)]
id[!is.na(id)] <- rep(seq_along(x), times=x)
#[1]  1  1  1  1  1  1 NA NA NA  2  2  2  2  2 NA NA  3  3

另一种可能性:

ifelse(value != 0, 
       cumsum(value != 0 & dplyr::lag(value) %in% c(0, NA)), 
       NA)
# [1]  1  1  1  1  1  1 NA NA NA  2  2  2  2  2 NA NA  3  3
  1. 你需要定义一个向量向量,所以在 v[0] 中你会发现第一组的所有值,在 v[1] 中你会发现第二组的所有值,依此类推,
  2. 当您找到零值时,您需要遍历所有值。继续,直到找到负离子零。用 1 递增向量并添加值,依此类推,

我希望这个答案有所帮助。

最新更新