如何在 R 中对数据进行子集化而不丢失 NA 行?

2024-04-05

我正在 R 中查看一些数据。一个名为“Height”的特定列包含几行 NA。

我希望对我的数据框进行子集化,以便将高于特定值的所有高度都排除在我的分析之外。

df2 <- subset ( df1 , Height < 40 )

然而,每当我这样做时,R 都会自动删除所有包含高度 NA 值的行。我不想要这个。我尝试过包含 na.rm 的参数

f1 <- function ( x , na.rm = FALSE ) {
df2 <- subset ( x , Height < 40 )
}
f1 ( df1 , na.rm = FALSE )

但这似乎没有做任何事情;带有 NA 的行最终仍然从我的数据框中消失。有没有办法对我的数据进行子集化,而不丢失 NA 行?


如果我们决定使用subset函数,那么我们需要注意:

For ordinary vectors, the result is simply ‘x[subset & !is.na(subset)]’.

因此仅保留非 NA 值。

如果你想保留NA情况下,使用逻辑或条件告诉 R 不要丢弃NA cases:

subset(df1, Height < 40 | is.na(Height))
# or `df1[df1$Height < 40 | is.na(df1$Height), ]`

不要直接使用(很快就会解释):

df2 <- df1[df1$Height < 40, ]

Example

df1 <- data.frame(Height = c(NA, 2, 4, NA, 50, 60), y = 1:6)

subset(df1, Height < 40 | is.na(Height))

#  Height y
#1     NA 1
#2      2 2
#3      4 3
#4     NA 4

df1[df1$Height < 40, ]

#  Height  y
#1     NA NA
#2      2  2
#3      4  3
#4     NA NA

后者失败的原因是索引NA gives NA。考虑这个带有向量的简单示例:

x <- 1:4
ind <- c(NA, TRUE, NA, FALSE)
x[ind]
# [1] NA  2 NA

我们需要以某种方式取代那些NA with TRUE。最直接的方法是添加另一个“或”条件is.na(ind):

x[ind | is.na(ind)]
# [1] 1 2 3

这正是您的情况会发生的情况。如果你的Height包含NA,然后进行逻辑运算Height < 40最终混合成TRUE / FALSE / NA,所以我们需要替换NA by TRUE如上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 R 中对数据进行子集化而不丢失 NA 行? 的相关文章

随机推荐