省略包含NA的特定列的行

use*_*975 113 r dataframe na

我想知道如何省略NA数据框中的值,但只在我感兴趣的某些列中.

例如,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
Run Code Online (Sandbox Code Playgroud)

但我只是想省略其中的数据yNA,因此结果应该是

  x  y  z
1 1  0 NA
2 2 10 33
Run Code Online (Sandbox Code Playgroud)

na.omit似乎删除所有行包含任何NA.

有人可以帮我解决这个简单的问题吗?

但如果现在我改变了这样的问题:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA))
Run Code Online (Sandbox Code Playgroud)

如果我只想省略x=na或者z=na,我可以|在哪里放入函数?

mne*_*nel 173

使用 is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
DF[!is.na(DF$y),]
Run Code Online (Sandbox Code Playgroud)

  • 使用 `na.omit` 贪婪地删除任何列 `na.omit(DF)` 中带有 NA 的所有行 (4认同)
  • 您如何将这种方法贪婪地应用于数据集中的所有列?如果任何列值为 NA 则跳过。所以你的数据集输出只是第二列。 (2认同)

Ben*_*nes 73

您可以使用该complete.cases函数并将其放入函数中:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

completeFun(DF, "y")
#   x  y  z
# 1 1  0 NA
# 2 2 10 33

completeFun(DF, c("y", "z"))
#   x  y  z
# 2 2 10 33
Run Code Online (Sandbox Code Playgroud)

编辑: 只返回没有NAs的行

如果要删除任何列中至少有一行的所有行NA,只需直接使用该complete.cases函数:

DF[complete.cases(DF), ]
#   x  y  z
# 2 2 10 33
Run Code Online (Sandbox Code Playgroud)

或者,如果completeFun已经在您的工作流程中根深蒂固;)

completeFun(DF, names(DF))
Run Code Online (Sandbox Code Playgroud)


amr*_*rrs 58

哈德利tidyr刚刚获得了这个惊人的功能drop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33
Run Code Online (Sandbox Code Playgroud)

  • 此方法还允许您指定多个列(用于删除 NA 值)。例如,可以使用 DF %&gt;% drop_na(y,z) 删除 y 和 z 列中的 NA 值。 (3认同)

Rno*_*oob 28

使用'子集'

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))
Run Code Online (Sandbox Code Playgroud)


小智 5

现在,可以只使用:

na.omit(data, cols = c("x", "z"))
Run Code Online (Sandbox Code Playgroud)

  • `cols=` 参数在 `data.table::na.omit` 库中可用。不是基本的 `stats::na.omit`。 (6认同)

M.V*_*ing 5

如果两个特定列中的任何一个包含<NA>.

DF[!is.na(DF$x)&!is.na(DF$z),]
Run Code Online (Sandbox Code Playgroud)