R 从单个操作和比较中排除具有NA值的行的简单或默认方法
我处理调查数据,其中缺少的值是规则,而不是例外。我的数据集总是有很多NAs,对于简单的统计数据,我通常希望处理那些在特定操作所需的变量子集上完整的案例,而忽略其他案例 如果输入中有任何NAs,则R的大多数基函数返回NA。此外,使用比较运算符的子集将为其中一个变量上带有NA的任何行返回一行NAs。我真的不想要这两种行为中的任何一种 对于R,我希望默认情况下为其操作的变量排除带有NAs的行,并为其余行返回结果(请参见下面的示例) 以下是我目前了解的解决方法:R 从单个操作和比较中排除具有NA值的行的简单或默认方法,r,na,R,Na,我处理调查数据,其中缺少的值是规则,而不是例外。我的数据集总是有很多NAs,对于简单的统计数据,我通常希望处理那些在特定操作所需的变量子集上完整的案例,而忽略其他案例 如果输入中有任何NAs,则R的大多数基函数返回NA。此外,使用比较运算符的子集将为其中一个变量上带有NA的任何行返回一行NAs。我真的不想要这两种行为中的任何一种 对于R,我希望默认情况下为其操作的变量排除带有NAs的行,并为其余行返回结果(请参见下面的示例) 以下是我目前了解的解决方法: 指定na.rm=T:还不错,但并非所有函
na.rm=T
:还不错,但并非所有函数都支持它李>
!is.na()
适用于所有比较操作:工作正常,但手工操作很烦人且容易出错,尤其是当涉及多个变量时complete.cases()
:没有帮助,因为我不想排除缺少任何变量的情况,只排除当前操作中使用的变量李>
> z<-data.frame(x=c(413,612,96,8,NA), y=c(314,69,400,NA,8888))
# current behavior:
> z[z$x < z$y ,]
x y
3 96 400
NA NA NA
NA.1 NA NA
# Desired behavior:
> z[z$x < z$y ,]
x y
3 96 400
# What I currently have to do in order to get the desired output:
> z[(z$x < z$y) & !is.na(z$x) & !is.na(z$y) ,]
x y
3 96 400
>z z[z$xz[z$xz[(z$x
在不平等情况下处理NAs的一个技巧是
z[which(z$x < z$y),]
# x y
# 3 96 400
z[其中(z$x
which()
会自动删除NA值。NA.ommit
函数在这里可能很方便:NA.ommit(z[z$x
根据您在代码中的使用方式,您可以尝试子集
而不是提取([
)。这会给出所需的行为:子集(z,x
。输入更少,并且不会随着涉及的变量数量的增加而增加。这绝对是一种改进!