我有以下 Dataframe df(dput
如下):
> df
id value
1 1 1
2 2 3
3 3 2
4 NA 1
5 NA 3
6 8 4
7 9 2
8 10 1
9 NA 1
10 NA 3
11 15 2
12 16 1
13 NA 3
14 NA 4
15 NA 2
16 20 1
17 21 1
18 22 3
19 NA 2
20 NA 1
21 NA 3
22 66 4
23 67 2
24 68 1
对于非NA
“id”的每个连续运行,我想创建一个唯一的组ID(示例中的变量“id 2”)。对于中间的NA
,“id 2”应该是NA
。
在示例中,第一次运行的非NA
“id”(1、2和3)应全部属于组1(id 2 = 1)。第4-5行的NA
应具有id 2 = NA
。第二次运行的非NA
“id”(8、9、10)应具有id 2 = 2,依此类推。
所需的输出应如下所示:
id value id2
1 1 1 1
2 2 3 1
3 3 2 1
4 NA 1 NA
5 NA 3 NA
6 8 4 2
7 9 2 2
8 10 1 2
9 NA 1 NA
10 NA 3 NA
11 15 2 3
12 16 1 3
13 NA 3 NA
14 NA 4 NA
15 NA 2 NA
16 20 1 4
17 21 1 4
18 22 3 4
19 NA 2 NA
20 NA 1 NA
21 NA 3 NA
22 66 4 5
23 67 2 5
24 68 1 5
正如你所看到的,id 2显示了我想要的NA之间的id值的唯一id。可能在值之后只有NA
,比如id的1,2和3。所以我想知道是否有人知道如何为NA
之间的值创建一个唯一的ID?
df的dput
:
df <- structure(list(id = c(1, 2, 3, NA, NA, 8, 9, 10, NA, NA, 15,
16, NA, NA, NA, 20, 21, 22, NA, NA, NA, 66, 67, 68), value = c(1,
3, 2, 1, 3, 4, 2, 1, 1, 3, 2, 1, 3, 4, 2, 1, 1, 3, 2, 1, 3, 4,
2, 1)), class = "data.frame", row.names = c(NA, -24L))
4条答案
按热度按时间zlwx9yxi1#
这里有一个可能性,也许不是最有效的:
1.找到有效的
id
和NA
之间的转换。每次我们有一个id
,它是NA
,但前一个是有效的。1.累计
1.根据需要添加
NA
创建于2023-03-21带有reprex v2.0.2
qjp7pelc2#
使用
rle
+cumsum
+replace
的基本R选项或者一个更简洁的
with(rle(!is.na(id)), rep(cumsum(values) * NA^!values, lengths))
(感谢Henrik的评论),它可以给予xuo3flqw3#
使用
data.table
或在
base R
中igetnqfo4#
在一个不优雅的(主要是)base R方法中,你可以在NA值上使用
split
,然后将do.call(rbind,...)
放在一起,然后清理组赋值。“主要是”base R,因为我使用data.table::rleid()
作为最终的组名:输出: