首页 文章

在data.frame中显示具有NA的列

提问于
浏览
17

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

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

返回“colMeans中的错误(df):'x'必须是数字 . ”因此,我目前的解决方案是转置数据框并运行complete.cases,但我猜测有一些变体(或者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的列吗?

3 回答

  • 24

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

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

    EDIT:

    我想其他人都写完了所以这里完成了:

    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
    

    这是一个视觉效果:
    enter image description here

    Edit 当时我写的这个 anyNA 不存在或者我没有意识到它 . 根据 ?anyNA 的帮助手册,这可能会加快速度......

    通用函数anyNA以更快的方式实现任何(is.na(x))(特别是对于原子向量) .

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

    这是一种方式:

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

    希望能帮助到你,

    马诺埃尔

  • 6

    单程...

    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名称 .

相关问题