我有一个数据框架,其中某些列包含所有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]。
答案 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
函数返回TRUE
或FALSE
,指示是否缺少值。然后,如果all
函数的所有参数均为TRUE
,则返回TRUE
。 sapply
函数将函数应用于数据帧中的每一列,并返回向量(在这种情况下为逻辑),而which
函数将逻辑向量转换为列的索引。
答案 2 :(得分:0)
这里是使用tidyverse
library(tidyverse)
df %>%
map_lgl(~ all(is.na(.x))) %>%
which
# D G
# 4 7