在
data.table
中,我想用最接近的先前非NA值来填充先前的NA,类似于这篇文章
但是,我想保留非 NA 值之后出现的任何 NA。之后
na.locf()
函数似乎取代了 NA。我的数据是格式化的本体图,因此第一列region_level1
是顶级祖先,后续列是更专业的区域。一些祖先可以分为更多的子术语,例如Cerebral cortex
可以分为Cerebral cortex 1
和Cerebral cortex 2
,而Temporal cortex
不能,这就是为什么后面的列中有NA,因为没有现有的子术语。
我想要实现的目标的一个例子:
输入数据:
input_data <- data.frame(
region_level1 = c("Brain", NA, NA, NA, NA, NA),
region_level2 = c(NA, "Grey Matter", NA, NA, NA, NA),
region_level3 = c(NA, NA, "Cerebral Cortex", NA, NA, "Temporal Cortex"),
region_level4 = c(NA, NA, NA, "Cerebral cortex 1", "Cerebral cortex 2", NA),
stringsAsFactors = FALSE
)
所需输出:
desired_output <- data.frame(
region_level1 = c("Brain", "Brain", "Brain", "Brain", "Brain", "Brain"),
region_level2 = c(NA, "Grey Matter", "Grey Matter", "Grey Matter", "Grey Matter", "Grey Matter"),
region_level3 = c(NA, NA, "Cerebral Cortex", "Cerebral Cortex", "Cerebral Cortex", "Temporal Cortex"),
region_level4 = c(NA, NA, NA, "Cerebral cortex 1", "Cerebral cortex 2", NA),
stringsAsFactors = FALSE
)
使用
na.locf()
功能:
converted_data <- zoo::zoo(original_data)
converted_data <- zoo::na.locf(converted_data)
有什么办法可以保留后续的NA吗?
这是一种选择:
f <- \(x) {
d = which(!is.na(x))
if(length(d) == 1) x[d:length(x)] <- zoo::na.locf(x)
if(length(d)>1) x[d[1]:(d[2]-1)] <- x[d[1]]
return(x)
}
original_data[,lapply(.SD,f)]
输出:
V1 V2 V3 V4
<char> <char> <char> <char>
1: Brain <NA> <NA> <NA>
2: Brain Grey Matter <NA> <NA>
3: Brain Grey Matter Cerebral Cortex <NA>
4: Brain Grey Matter Cerebral Cortex Cerebral cortex 1
5: Brain Grey Matter Cerebral Cortex Cerebral cortex 2
6: Brain Grey Matter Temporal Cortex <NA>