【问题标题】:Find the index of columns containing more than 5 NA values查找包含超过 5 个 NA 值的列的索引
【发布时间】:2018-11-17 11:34:48
【问题描述】:

我想对数据框进行子集化并仅提取包含 5 个或更多 NA 值的列。

data.frame(A = rep(1, 10), B = c(rep(2,5), rep(3,5)), D = rep(5, 10), E = c(rep(1,2), rep(NA,6), rep(6,2)), F = c(rep(NA,2), rep(2,8)))

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

所以在这个例子中我想要列“E”的索引。

我的原始数据集大约有 3000 列,因此速度或多或少很重要。

我一直在尝试使用 sum(is.na)filter_if(any_vars) 来做这件事,但都无济于事..

【问题讨论】:

  • 给出的答案很好,但是由于您提到提取实际列(不仅仅是它们的索引/名称),因此方法如下(如果从答案中不明显):df[colSums(is.na(df)) > 5]dplyr:df %>% select_if(~sum(is.na(.)) > 5)

标签: r dataframe subset na


【解决方案1】:

ColSumsis.na 一起使用

names(df)[colSums(is.na(df))>5]
[1] "E"

【讨论】:

    【解决方案2】:

    我们可以在逻辑矩阵(is.na(df1))上使用colSums,用which获取索引并提取names

    names(which(colSums(is.na(df1)) >= 5))
    #[1] "E"
    

    【讨论】:

      【解决方案3】:
      which(unlist(lapply(df, function(x) sum(is.na(x)) > 5)))
      4 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 2017-11-19
        • 2018-07-26
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        相关资源
        最近更新 更多