【问题标题】:Find names of columns which contain missing values查找包含缺失值的列的名称
【发布时间】:2013-12-20 07:05:03
【问题描述】:

我想找到所有带有NA 或缺失数据的列名,并将这些列名存储在一个向量中。

# create matrix
a <- c(1,2,3,4,5,NA,7,8,9,10,NA,12,13,14,NA,16,17,18,19,20)
cnames <- c("aa", "bb", "cc", "dd", "ee")
mymatrix <- matrix(a, nrow = 4, ncol = 5, byrow = TRUE)
colnames(mymatrix) <- cnames
mymatrix
#      aa bb cc dd ee
# [1,]  1  2  3  4  5
# [2,] NA  7  8  9 10
# [3,] NA 12 13 14 NA
# [4,] 16 17 18 19 20

想要的结果:"aa""ee" 列。

我的尝试:

bad <- character()
for (j in 1:4){     
  tmp <- which(colnames(mymatrix[j, ]) %in% c("", "NA"))
  bad <- tmp
}

但是,我不断收到integer(0) 作为我的输出。任何帮助表示赞赏。

【问题讨论】:

    标签: r na


    【解决方案1】:

    像这样?

    colnames(mymatrix)[colSums(is.na(mymatrix)) > 0]
    # [1] "aa" "ee"
    

    或者按照@thelatemail 的建议:

    names(which(colSums(is.na(mymatrix)) > 0))
    # [1] "aa" "ee"
    

    【讨论】:

    • 没错!谢谢你。我仍然不明白为什么我无法使用 which(colnames) 解决它
    • 另一种无需引用mymatrix 的方法是names(which(colSums(is.na(mymatrix))&gt;0))
    • @lever - 因为 colnames 从来都不是 NA - NA 是每列实际数据中的值,而不是名称。试试colnames(mymatrix) 看看看不到NA
    • @thelatemail - 感谢您的解释。它与初学者的解决方案一样有价值
    • 此外,“NA”与 NA 不同——第一个是包含两个字母的文本字符串,第二个是没有值的表示。
    【解决方案2】:

    R 3.1 引入了anyNA 函数,更加方便快捷:

    colnames(mymatrix)[ apply(mymatrix, 2, anyNA) ]
    

    旧答案:

    如果它是一个很长的矩阵,apply + any 可以短路并运行得更快。

    apply(is.na(mymatrix), 2, any)
    #   aa    bb    cc    dd    ee 
    # TRUE FALSE FALSE FALSE  TRUE 
    colnames(mymatrix)[apply(is.na(mymatrix), 2, any)]
    # [1] "aa" "ee"
    

    【讨论】:

    • 适用于 R 3.4/RStudio 1.3
    【解决方案3】:

    如果您的数据框包含非数字列,则此解决方案更通用(基于以前的答案):

    R 3.1 +

    names(which(sapply(mymatrix, anyNA)))

    names(which(sapply(mymatrix, function(x) any(is.na(x)))))

    【讨论】:

    • 适用于 R 3.4/RStudio 1.3
    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 2019-09-21
    • 2022-01-17
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多