用最新的非 NA 值替换先前的 NA,同时保留后续的 NA

问题描述 投票:0回答:1

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吗?

r data.table zoo
1个回答
1
投票

这是一种选择:

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>
© www.soinside.com 2019 - 2024. All rights reserved.