【问题标题】:Show columns with NAs in a data.frame在 data.frame 中显示带有 NA 的列
【发布时间】:2023-03-31 19:30:01
【问题描述】:

我想在包含缺失值的大型数据框中显示列的名称。基本上,我想要等价于 complete.cases(df) 但对于列,而不是行。有些列是非数字的,所以类似于

names(df[is.na(colMeans(df))])

返回“colMeans(df) 中的错误:‘x’必须是数字。”所以,我目前的解决方案是转置数据帧并运行 complete.cases,但我猜有一些 apply 的变体(或 plyr 中的某些东西)效率更高。

nacols <- function(df) {
  names(df[,!complete.cases(t(df))])
} 

w <- c("hello","goodbye","stuff")
x <- c(1,2,3)
y <- c(1,NA,0)
z <- c(1,0, NA)
tmp <- data.frame(w,x,y,z)

nacols(tmp)
[1] "y" "z"

谁能告诉我一个更有效的函数来识别具有 NA 的列?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是我所知道的最快的方式:

    unlist(lapply(df, function(x) any(is.na(x))))
    

    编辑:

    我猜其他人都写完了,所以这里是完整的:

    nacols <- function(df) {
        colnames(df)[unlist(lapply(df, function(x) any(is.na(x))))]
    }
    

    如果您在 WIN 7 机器上对这 4 个解决方案进行微基准测试:

    Unit: microseconds
        expr     min      lq  median      uq        max
    1 ANDRIE  85.380  91.911 106.375 116.639    863.124
    2 MANOEL  87.712  93.778 105.908 118.971   8426.886
    3  MOIRA 764.215 798.273 817.402 876.188 143039.632
    4  TYLER  51.321  57.853  62.518  72.316   1365.136
    

    这是一个视觉效果:

    编辑 在我写这篇文章的时候,anyNA 不存在或者我不知道。这可能会加快速度...根据?anyNA 的帮助手册:

    通用函数anyNA 以一种可能更快的方式实现any(is.na(x))(尤其是对于原子向量)。

    nacols <- function(df) {
        colnames(df)[unlist(lapply(df, function(x) anyNA(x)))]
    }
    

    【讨论】:

      【解决方案2】:

      这是一种方法:

      colnames(tmp)[colSums(is.na(tmp)) > 0]
      

      希望对你有帮助,

      马诺尔

      【讨论】:

        【解决方案3】:

        一种方式...

        nacols <- function(x){
          y <- sapply(x, function(xx)any(is.na(xx)))
          names(y[y])
        }  
        
        nacols(tmp)
        [1] "y" "z"
        

        解释:由于结果 y 是一个逻辑向量,names(y[y]) 仅在 y 为 TRUE 的情况下返回 y 的名称。

        【讨论】:

        • 安德烈是我。我本来打算给所有给出正确答案的人投票,但我匆忙中投了反对票。后来当我看到你的投票是 0 而不是 2 时,我意识到了这一点,但后来我的投票被锁定了。解决它的唯一方法(我认为)是如果您编辑您的回复,我可以更改投票。
        猜你喜欢
        • 1970-01-01
        • 2017-09-02
        • 2016-01-08
        • 2014-02-28
        • 2021-06-20
        • 2020-09-22
        • 1970-01-01
        • 2018-01-05
        • 1970-01-01
        相关资源
        最近更新 更多