【问题标题】:Efficient method to subset drop rows with NA values in R在R中使用NA值子集删除行的有效方法
【发布时间】:2013-12-18 23:53:46
【问题描述】:

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

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

> my.df[!is.na(my.df$termA)&!is.na(my.df$termB)&!is.na(my.df$termD),]

但我相信还有更优雅的方法。

【问题讨论】:

  • 你试过了吗:na.omit(my.df)
  • 我没有,多么有用的功能,谢谢!在这种情况下,我有一些其他带有 NA 值的向量,我没有使用它们,并且术语因此不想用作丢弃标准,所以它在这里不能完美地工作。
  • 我已在问题中添加了该详细信息。

标签: r indexing dataframe subset na


【解决方案1】:

编辑:我完全忽略了subset,这是用于子设置的内置函数:

my.df <- subset(my.df, 
  !(is.na(termA) |
    is.na(termB) |
    is.na(termC) )
  )

我倾向于将with() 用于此类事情。不要使用attach,你一定会割伤自己。

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

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

is_any <- function(x){
  !is.na(x)
}

如果您最终做了很多此类事情,那么使用 SQL 通常会更好地与数据子集进行交互。 dplyr 也可能有用。

【讨论】:

    【解决方案2】:

    dat 是一个数据框,cols 是一个由感兴趣的列名或列号组成的向量。然后就可以使用了

    dat[!rowSums(is.na(dat[cols])), ]
    

    排除包含至少一个NA 的所有行。

    【讨论】:

    • 这是在特定列中消除NAs 问题的最佳解决方案。我仍然喜欢with 解决方案,因为它允许您很好地执行其他条件,然后也可以很好地使用within 更改数据原位
    【解决方案3】:

    这是一种方式:

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

    还有一个,使用sapply(...)Reduce(...)

    xx <- data.frame(!sapply(df[2:4],is.na))
    yy <- Reduce("&",xx)
    zz <- df[yy,]
    

    第一条语句将函数is.na(...)“应用”到df的第2:4列,并反转结果(我们想要!NA)。第二条语句将逻辑&amp; 运算符连续应用于xx 的列。第三条语句仅提取带有yy=T 的行。显然,这可以组合成一个极其复杂的陈述。

    zz <-df[Reduce("&",data.frame(!sapply(df[2:4],is.na))),]
    

    如果您有很多列,使用 sapply(...)Reduce(...) 会更快。

    最后,大多数建模函数都具有可以设置为直接处理 NA 的参数(无需求助于所有这些)。例如,参见lm(...) 中的na.action 参数。

    【讨论】:

    • 在处理 NA 时,这些显然比我的解决方案要好。对于大小合理的数据帧,for 循环还具有易于理解的优点。我喜欢使用 with 的解决方案,因为它可以很好地转换为多个不同的标准(颜色 == 'green'、species %in% c('setosa'、'versicolor') 等)
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 2016-07-20
    • 2017-06-12
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多