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

Fra*_* B. 1 r missing-data na

鉴于以下示例数据集:

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
Run Code Online (Sandbox Code Playgroud)

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

我想要的手动版本是:

kmeans_model <- kmeans(df[, -c(2:4, 6)], 10) 
Run Code Online (Sandbox Code Playgroud)

伪代码将是:

kmeans_model <- kmeans(df[, -c(colnames(is.na(df)))], 10) 
Run Code Online (Sandbox Code Playgroud)

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

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

tal*_*lat 5

这里有两个没有 的选项sapply

kmeans_model <- kmeans(df[, !colSums(is.na(df))], 10) 
Run Code Online (Sandbox Code Playgroud)

或者

kmeans_model <- kmeans(df[, colSums(is.na(df)) == 0], 10) 
Run Code Online (Sandbox Code Playgroud)

解释:

colSums(is.na(df)) 计算每列 NA 的数量,结果为:

colSums(is.na(df))
#varA varB varC varD varE varF 
#   0    1    1    1    0    2 
Run Code Online (Sandbox Code Playgroud)

进而

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

是相同的

!colSums(is.na(df))
#varA  varB  varC  varD  varE  varF 
#TRUE FALSE FALSE FALSE  TRUE FALSE 
Run Code Online (Sandbox Code Playgroud)

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