使用R中的NA值来子集丢弃行的有效方法

Ore*_*hes 8 indexing r subset dataframe na

背景 在运行逐步模型选择之前,我需要删除任何模型术语的缺失值.因为我的模型中有相当多的术语,所以我需要查看相当多的向量来获取NA值(并删除任何这些向量中具有NA值的行).但是,也有一些包含NA值的向量,我不想将其用作删除行的术语/条件.

问题 如何从数据框中删除包含任何矢量列表的NA值的行?我目前正在使用一长串!is.na的笨重方法

> my.df[!is.na(my.df$termA)&!is.na(my.df$termB)&!is.na(my.df$termD),]
Run Code Online (Sandbox Code Playgroud)

但我确信有一种更优雅的方法.

Sve*_*ein 12

让我们dat为数据帧和cols列名或感兴趣的列数的向量.然后你可以使用

dat[!rowSums(is.na(dat[cols])), ]
Run Code Online (Sandbox Code Playgroud)

排除至少有一个的所有行NA.


Tyl*_*ler 7

编辑:我完全掩饰了subset内置函数,用于子设置:

my.df <- subset(my.df, 
  !(is.na(termA) |
    is.na(termB) |
    is.na(termC) )
  )
Run Code Online (Sandbox Code Playgroud)

我倾向于使用这样with()的东西.不要使用attach,你一定会削减自己.

my.df <- my.df[with(my.df, {
  !(is.na(termA) |
    is.na(termB) |
    is.na(termC) )
}), ]
Run Code Online (Sandbox Code Playgroud)

但是如果你经常这样做,你可能也想要一个辅助函数, is_any()

is_any <- function(x){
  !is.na(x)
}
Run Code Online (Sandbox Code Playgroud)

如果你最终做了很多这样的事情,那么使用SQL通常会与数据子集进行更好的交互.dplyr也可能证明是有用的.