识别仅具有NA的数据框列

时间:2018-07-06 15:20:59

标签: r dataframe na

我有一个数据框架,其中某些列包含所有NA,并且我想获得包含所有NA的列索引的向量。例如:

   A  B  C  D  E  F  G     
 1 4  5  3  NA 9  NA NA
 2 8  9  7  NA 9  9  NA
 3 1  1  6  NA 5  3  NA

由于第4列和第9列包含所有NA,因此应给出[4 7]。

3 个答案:

答案 0 :(得分:0)

您可以使用插入符号中的nearZeroVar功能。

# set freqCut to 100/0, default is 95/5
caret::nearZeroVar(df1, freqCut = 100/0)
[1] 4 7

使用李哲源的which

# option 1
which(colSums(sapply(df1, is.na)) == nrow(df1))
D G 
4 7 

# option 2
which(colSums(!is.na(df1)) == 0)
D G 
4 7 

基准:

microbenchmark::microbenchmark(caret = caret::nearZeroVar(df1, freqCut = 100/0),
                               which1 = which(colSums(sapply(df1, is.na)) == nrow(df1)),
                               which2 = which(colSums(!is.na(df1)) == 0))


Unit: microseconds
   expr      min        lq       mean   median        uq       max neval
  caret 1092.459 1109.8670 1266.86065 1130.494 1166.1870 13563.868   100
 which1   29.843   34.0850   39.03823   38.473   42.1310   110.885   100
 which2   21.358   24.5765   28.99438   29.111   32.7685    52.663   100

which选项2总体上最快。

答案 1 :(得分:0)

怎么样:

which( sapply( DF, function(x) all(is.na(x)) ) )

is.na函数返回TRUEFALSE,指示是否缺少值。然后,如果all函数的所有参数均为TRUE,则返回TRUEsapply函数将函数应用于数据帧中的每一列,并返回向量(在这种情况下为逻辑),而which函数将逻辑向量转换为列的索引。

答案 2 :(得分:0)

这里是使用tidyverse

的选项
library(tidyverse)
df %>%
  map_lgl(~ all(is.na(.x))) %>% 
  which
#  D G 
#  4 7