代码之家  ›  专栏  ›  技术社区  ›  Frank B.

在R中使用is.na获取包含na值的列名

  •  1
  • Frank B.  · 技术社区  · 11 年前

    给出以下示例数据集:

    df <- as.data.frame(matrix( c(1, 2, 3, NA, 5, NA, 
                                  7, NA, 9, 10, NA, NA), nrow=2, ncol=6))
    
    names(df) <- c(  "varA", "varB", "varC", "varD", "varE", "varF")
    
    print(df)
    
      varA varB varC varD varE varF
    1    1    3    5    7    9   NA
    2    2   NA   NA   NA   10   NA
    

    我希望能够在数据集上使用kmean(…),而不必手动检查或删除包含NA的变量 在任何地方 在变量内。虽然我现在正在询问kmeans(…),但我将对其他事情使用类似的过程,因此kmeans的特定答案不能完全回答我的问题。

    我想要的手动版本是:

    kmeans_model <- kmeans(df[, -c(2:4, 6)], 10) 
    

    伪代码将是:

    kmeans_model <- kmeans(df[, -c(colnames(is.na(df)))], 10) 
    

    另外,我不想从df中删除数据。提前感谢。

    (显然kmeans(…)无法处理这个示例数据集,但我无法重新创建真实的数据集)

    2 回复  |  直到 11 年前
        1
  •  5
  •   talat    11 年前

    这里有两个选项 sapply :

    kmeans_model <- kmeans(df[, !colSums(is.na(df))], 10) 
    

    kmeans_model <- kmeans(df[, colSums(is.na(df)) == 0], 10) 
    

    说明:

    colSums(is.na(df)) 统计每列的NA数,结果是:

    colSums(is.na(df))
    #varA varB varC varD varE varF 
    #   0    1    1    1    0    2 
    

    然后

    colSums(is.na(df)) == 0     # converts to logical TRUE/FALSE
    #varA  varB  varC  varD  varE  varF 
    #TRUE FALSE FALSE FALSE  TRUE FALSE 
    

    !colSums(is.na(df))
    #varA  varB  varC  varD  varE  varF 
    #TRUE FALSE FALSE FALSE  TRUE FALSE 
    

    这两种方法都可以用于仅对逻辑值为TRUE的列进行子集

        2
  •  2
  •   Saurabh Jain    8 年前

    这是我用于列出列名及其NA计数的通用方法:

    sort(colSums(is.na(df)> 0), decreasing = T)
    

    如果您想使用sapply,也可以引用以下代码段:

    flights_NA_cols <- sapply(flights, function(x) sum(is.na(x))) 
    flights_NA_cols[flights_NA_cols>0]