Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中使用NA值对drop行进行子集划分的有效方法_R_Indexing_Dataframe_Subset_Na - Fatal编程技术网

在R中使用NA值对drop行进行子集划分的有效方法

在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),] 但我确信还有一种更优雅的方法

背景 在运行逐步模型选择之前,我需要删除任何模型项的缺失值。在我的模型中有很多术语,因此有很多向量需要查找NA值(并删除任何向量中有NA值的行)。但是,也有一些向量包含NA值,我不想将其用作删除行的术语/标准

问题 如何从包含任何向量列表NA值的数据帧中删除行?我目前使用的是一长串的笨拙方法!是的,娜娜的

> 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])), ]