【问题标题】:Using is.na in R to get Column Names that Contain NA Values在 R 中使用 is.na 获取包含 NA 值的列名
【发布时间】:2017-11-30 18:29:23
【问题描述】:

给出下面的示例数据集:

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

我希望能够在数据集上使用 kmeans(...),而无需手动检查或删除在变量中包含 NA anywhere 的变量。虽然我现在正在询问 kmeans(...) 我将对其他事情使用类似的过程,因此 kmeans(...) 特定答案不会完全回答我的问题。

我想要的手动版本是:

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

伪代码是:

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

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

(显然 kmeans(...) 不适用于此示例数据集,但我无法重新创建真实数据集)

【问题讨论】:

  • 可能是df[, which(!sapply(df, function(col) sum(!is.na(col)) &gt; 0))]
  • @lukeA 使用any() 可能会更容易阅读并且稍微短一些。 (不过可能会慢一些,我得检查一下。)
  • @joran 我检查并因此选择了sum。 ;)
  • @lukeA 好吧,给你! :)

标签: r missing-data na


【解决方案1】:

这里有两个不带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】:

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

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

    如果你想使用sapply,你也可以参考这段代码sn-p:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2023-03-13
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 2014-08-15
      相关资源
      最近更新 更多