R中NA的条件操作

Posted

技术标签:

【中文标题】R中NA的条件操作【英文标题】:Conditional manipulation of NAs in R 【发布时间】:2014-04-08 13:29:01 【问题描述】:

我有一个数据框,其中包含不同个体的观察结果。

第一列包含个人的姓名,以下列包含观察到的状态,而每一列代表一个月。

在观察期间,个体出生,在他们出生之前产生NA观察,并且他们出于最后一次观察中显示的原因离开群体,导致在最后一次观察之后产生NAs。我想将第一次观察之前的NAs 更改为某个值,并在人口离开后将NAs 更改为最后一次观察。

由于数据框包含超过 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的条件操作的主要内容,如果未能解决你的问题,请参考以下文章

R:一次根据一列中的条件将整行推送到NA

R语言is.na函数实战(删除替换统计条件判断等)

R语言dplyr包na_if函数根据条件将数据对象替换为NA值实战

如何根据R中的条件创建新变量

根据R中不同状态的条件创建列状态

R数据框 - 用另一列的条件填充缺失值