20

我想在包含缺失值的大型数据框中显示列的名称。基本上,我想要等价于 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 的列吗?

4

3 回答 3

27

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

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)))]
}
于 2012-05-13T18:42:07.520 回答
6

这是一种方法:

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

希望能帮助到你,

马诺埃尔

于 2012-05-13T18:42:32.967 回答
6

单程...

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

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

说明:由于结果y是一个逻辑向量,因此仅在为 TRUEnames(y[y])的情况下返回 y 的名称。y

于 2012-05-13T18:43:51.640 回答