我的数据集中有一列如下所示:
cluster_id
1
1
1
1
NA
1
NA
NA
2
NA
2
NA
3
NA
NA
3
cluster_id <- c("1","1","1","1","NA","1","NA","NA","2","NA","2","NA","3","NA","NA","3")
在使用时间列之前,顺序已经预先定义好了。我想要的是替换每个集群 ID 内的 NA,即,如果有一行是 2,然后是 NA,然后又是 2,我希望那个 NA 变成 2。数字之间的 NA 保持为 NA。示例:
cluster_id cluster_id_new
1 1
1 1
1 1
1 1
NA 1
1 1
NA NA
NA NA
2 2
NA 2
2 2
NA NA
3 3
NA 3
NA 3
3 3
我在这篇文章zoo::na.locf
中找到了该函数,它似乎接近我想要的,但我还需要考虑NA之后的值。有什么想法吗?
更新:感谢@Darren Tsai(提供了更好的版本):
tidyverse
原答案:主要使用方式如下fill
:该
collapse
包中有 和na_locf
。na_focb
您可以对每个包进行检查,然后检查是否存在差异。如果您的 NA 值存储为字符而不是
NA_character_
,则您首先需要转换为NA_character_
。解决方案还取决于您想如何处理前导/尾随的“NA”。第一个选项保留它们。
第二种解决方案使用单循环
for
并填充前导/尾随的“NA”。如果您的 NA 值实际上是
NA
,那就容易一些了。rle
这是一个带有+ 的基本 R 选项cumsum
使得
1)na.approx假设集群 ID 是整数,并且它们似乎以 1 为增量,因此执行线性插值并测试结果是否为整数就足以确定结果是否应该是 NA。
给予:
2) na.locf0如果 NA 的前向和后向 na.locf0 相同,则应将其替换。这更通用,因为它直接与字符值一起工作,并且不假设 id 增加 1。
笔记
我无法想到使用现有函数来满足您的标准的“聪明”解决方案;for 循环方法可行吗?
创建于 2024-09-27,使用reprex v2.1.0