我有以下数据帧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的1、2和3都应该是1;下一个id的8、9、10应该都是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

如您所见,id2显示了我希望在NA之间的id值中使用的唯一id.正如你所能做到的,在id的1,2和3这样的值之后可能只有一个NA.所以我想知道是否有人知道如何为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))

推荐答案

这里有一种可能性,也许不是最有效的:

  1. 找出有效的idNA之间的转换.每次我们得到id分,你就得到1分,这是NA分,但前一个是有效的.
  2. 使累计总和
  3. 在需要的地方加NA
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
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))

df |> 
  mutate(
    id2 = as.numeric(is.na(id) & !is.na(lag(id))),
    id2 = cumsum(id2) + 1,
    id2 = ifelse(is.na(id), NA, id2)
  )
#>    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

创建于2023-03-21,共reprex v2.0.2

R相关问答推荐

如何将y轴上的线定位得彼此更近

更改网格的crs以匹配简单要素点对象的crs

如何使用geom_sf在边界显示两种 colored颜色 ?

使用R中的Shapetime裁剪格栅文件

以R中的正确顺序将日期时间字符列转换为posixct

如何在xyplot中 for each 面板打印R^2

在R中替换函数中的特定符号

从R导出全局环境中的所有sf(numrames)对象

在数学中正确显示摄氏度、开氏度或华氏度

用相同方法得到不同函数的ROC最优截断值

对于变量的每个值,仅 Select 包含列表中所有值的值.R

如何读取CSV的特定列时,给定标题作为向量

跨列查找多个时间报告

在使用具有Bray-Curtis相似性的pvCluust时计算p值

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

如何将这个小列表转换为数据帧?

计算来自单独分组的分幅的值的百分位数

roxygen2正在处理太多的文件

是什么打破了此Quarto仪表板中的工具提示?