根据 NA 的出现次数创建分组变量

Create grouping variable based on the occurrences of NAs

提问人:user18894435 提问时间:3/10/2023 更新时间:3/10/2023 访问量:38

问:

我有一个包含列的数据帧:dfx

df <- data.frame(x = c(1, 1, NA, 1, 1, NA, NA, 1, 1))

这些只是占位符,用于表示任何不缺失的数值。我想创建另一个能够分组的列。1ydf

   x  y
1  1  1
2  1  1
3 NA  2
4  1  2
5  1  2
6 NA  3
7 NA  3
8  1  3
9  1  3

逻辑是,当遇到 a 时,将 1 加到前一个 .但是,如果 是串联的,则逻辑仅适用于第一次出现,因此 since 第 6 行的值相同。NAyNAy

R 数据帧 DPLYR 序列

评论


答:

2赞 Onyambu 3/10/2023 #1

在比较当前和之前之后,您可以通过调用以下命令来使用:cumsumlag

df %>%
   mutate(grp = cumsum(is.na(x) & !is.na(lag(x))) + 1)

   x grp
1  1   1
2  1   1
3 NA   2
4  1   2
5  1   2
6 NA   3
7 NA   3
8  1   3
9  1   3
0赞 TarJae 3/10/2023 #2

这是一个使用diffcumsum()

library(dplyr) 

df %>%
  mutate(grp = cumsum(c(0, diff(!is.na(x))) != 0 & !is.na(x))+1)

   x grp
1  1   1
2  1   1
3 NA   1
4  1   2
5  1   2
6 NA   2
7 NA   2
8  1   3
9  1   3
0赞 Onyambu 3/10/2023 #3
df %>%
   mutate(grp = dense_rank(x * consecutive_id(x)))%>%
   fill(grp, .direction = 'up')

   x grp
1  1   1
2  1   1
3 NA   2
4  1   2
5  1   2
6 NA   3
7 NA   3
8 NA   3
9  1   3

评论

0赞 user18894435 3/10/2023
这种方法可能对我不起作用,因为我说过这些 1 可以是任何不缺失的数值。但你的第一个答案非常有效。谢谢!