R中NA的条件操作
Posted
技术标签:
【中文标题】R中NA的条件操作【英文标题】:Conditional manipulation of NAs in R 【发布时间】:2014-04-08 13:29:01 【问题描述】:我有一个数据框,其中包含不同个体的观察结果。
第一列包含个人的姓名,以下列包含观察到的状态,而每一列代表一个月。
在观察期间,个体出生,在他们出生之前产生NA
观察,并且他们出于最后一次观察中显示的原因离开群体,导致在最后一次观察之后产生NA
s。我想将第一次观察之前的NA
s 更改为某个值,并在人口离开后将NA
s 更改为最后一次观察。
由于数据框包含超过 30,000 行和大约 400 列,因此我正在寻找一种有效的方法,而不是基本的 ifelse()
方法。
【问题讨论】:
你能发一个reproducible example 供大家一起工作吗? 【参考方案1】:zoo
包中的na.locf()
通过向前传递最后一个非 NA 值来替换 NA。 (不仅对于 尾随 NA,而且对于向量中间的 NA - 我假设您没有这些。)默认情况下,它会省略前导 NA。您可以将它们替换为指定的值,如下所示:
> library(zoo)
> xx <- c(NA, NA, 1, NA, 2, 3, NA, NA)
> replacement.for.initial.NAs <- -1
> foo <- min(which(!is.na(xx)))
> c(rep(replacement.for.initial.NAs,foo-1),na.locf(xx))
[1] -1 -1 1 1 2 3 3 3
您可以将其循环到您的个人身上。 apply()
和朋友可能有一种更聪明的方法来对数据结构的每一行或每一列执行此过程。
【讨论】:
太好了,我会试一试,然后回复你。非常感谢! 请注意,na.locf
有一个 na.rm=
参数,并且 zoo 的 na.fill
可用于使用指定的填充值填充 NA:na.fill(na.locf(xx, na.rm = FALSE), -1)
。如果xx
是矩阵,也可以使用。以上是关于R中NA的条件操作的主要内容,如果未能解决你的问题,请参考以下文章