R语言 为值块创建索引变量

bvhaajcl  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(125)

我有一个 Dataframe “data”,它有一个分组变量“grp”和一个二进制分类变量“classif”。对于grp中的每个组,我想创建一个“result”变量,在classif变量中创建一个0的单独块的索引。目前,我不知道如何为分组变量的每个级别重置计数,也找不到只为0块(忽略1)创建索引的方法。

示例数据:

grp <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3)
classif <- c(0,1,0,0,1,0,0,1,1,0,0,0,0,1,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0)
result <- c(1,0,2,2,0,3,3,0,0,1,1,1,1,0,2,0,0,0,3,3,0,0,1,1,1,0,2,0,3)
wrong_result <- c(1,2,3,3,4,5,5,1,1,2,2,2,2,3,4,5,5,5,6,6,1,1,2,2,2,3,4,5,6)
Data <- data.frame(grp,classif,result, wrong_result)

我试过使用rleid,但是下面的命令产生了“错误的结果”,这不是我想要的。

data[, wrong_result:= rleid(classif)]
data[, wrong_result:= rleid(classif), by=grp]
6ie5vjzr

6ie5vjzr1#

在dplyr中,使用cumsum()lag()查找.by组中的零块(确保使用最新版本的dplyr来使用.by参数)。

library(dplyr)

Data %>%
  mutate(
    result2 = ifelse(
      classif == 0,
      cumsum(classif == 0 & lag(classif, default = 1) == 1),
      0
    ),
    .by = grp
  )
grp classif result result2
1    1       0      1       1
2    1       1      0       0
3    1       0      2       2
4    1       0      2       2
5    1       1      0       0
6    1       0      3       3
7    1       0      3       3
8    2       1      0       0
9    2       1      0       0
10   2       0      1       1
11   2       0      1       1
12   2       0      1       1
13   2       0      1       1
14   2       1      0       0
15   2       0      2       2
16   2       1      0       0
17   2       1      0       0
18   2       1      0       0
19   2       0      3       3
20   2       0      3       3
21   3       1      0       0
22   3       1      0       0
23   3       0      1       1
24   3       0      1       1
25   3       0      1       1
26   3       1      0       0
27   3       0      2       2
28   3       1      0       0
29   3       0      3       3
whhtz7ly

whhtz7ly2#

使用rle并按顺序对产生的游程编号,然后将1的游程转换回零。不使用任何包。

seq0 <- function(x) {
  r <- rle(x)
  is0 <- r$values == 0
  r$values[is0] <- seq_len(sum(is0))
  inverse.rle(r) * !x
}
transform(Data, result2 = ave(classif, grp, FUN = seq0))

相关问题