在R中使用NA值对drop行进行子集划分的有效方法
背景 在运行逐步模型选择之前,我需要删除任何模型项的缺失值。在我的模型中有很多术语,因此有很多向量需要查找NA值(并删除任何向量中有NA值的行)。但是,也有一些向量包含NA值,我不想将其用作删除行的术语/标准 问题 如何从包含任何向量列表NA值的数据帧中删除行?我目前使用的是一长串的笨拙方法!是的,娜娜的在R中使用NA值对drop行进行子集划分的有效方法,r,indexing,dataframe,subset,na,R,Indexing,Dataframe,Subset,Na,背景 在运行逐步模型选择之前,我需要删除任何模型项的缺失值。在我的模型中有很多术语,因此有很多向量需要查找NA值(并删除任何向量中有NA值的行)。但是,也有一些向量包含NA值,我不想将其用作删除行的术语/标准 问题 如何从包含任何向量列表NA值的数据帧中删除行?我目前使用的是一长串的笨拙方法!是的,娜娜的 > my.df[!is.na(my.df$termA)&!is.na(my.df$termB)&!is.na(my.df$termD),] 但我确信还有一种更优雅的方法
> my.df[!is.na(my.df$termA)&!is.na(my.df$termB)&!is.na(my.df$termD),]
但我确信还有一种更优雅的方法。编辑:我完全忽略了
子集
,这是为子设置内容而设计的内置函数:
my.df <- subset(my.df,
!(is.na(termA) |
is.na(termB) |
is.na(termC) )
)
但是如果您经常这样做,您可能还需要一个helper函数,is\u any()
这是一种方式:
# create some random data
df <- data.frame(y=rnorm(100),x1=rnorm(100), x2=rnorm(100),x3=rnorm(100))
# introduce random NA's
df[round(runif(10,1,100)),]$x1 <- NA
df[round(runif(10,1,100)),]$x2 <- NA
df[round(runif(10,1,100)),]$x3 <- NA
# this does the actual work...
# assumes data is in columns 2:4, but can be anywhere
for (i in 2:4) {df <- df[!is.na(df[,i]),]}
第一条语句将函数is.na(…)
应用于df
的第2:4列,并反转结果(我们想要!na
)。第二条语句将逻辑&
运算符依次应用于xx
的列。第三条语句只提取yy=T
的行。显然,这可以组合成一个极其复杂的声明
zz <-df[Reduce("&",data.frame(!sapply(df[2:4],is.na))),]
zz将dat
设为数据帧,将cols
设为感兴趣的列名或列号向量。然后你可以用
dat[!rowSums(is.na(dat[cols])), ]
要排除至少有一个NA
的所有行,您是否尝试过:NA.omit(my.df)我没有,这是一个多么有用的函数,谢谢!在本例中,我有一些其他的带有NA值的向量,我没有使用这些向量和术语,因此不想将其用作删除标准,因此它在这里并不完美。我已经在问题中添加了这些细节。在处理NAs时,这些显然比我的解决方案要好。对于大小合理的数据帧,For循环还具有易于理解的优点。我喜欢使用带有
的解决方案,因为它具有额外的优势,可以很好地转换为多个不同的标准(颜色='green',物种%c('setosa','versicolor'),等等)。这是解决在特定列中消除NA
s问题的最佳解决方案。我仍然喜欢with
解决方案,因为它允许您很好地处理其他条件,然后还可以很好地在中使用就地更改数据。
xx <- data.frame(!sapply(df[2:4],is.na))
yy <- Reduce("&",xx)
zz <- df[yy,]
zz <-df[Reduce("&",data.frame(!sapply(df[2:4],is.na))),]
dat[!rowSums(is.na(dat[cols])), ]