鉴于以下示例数据集:
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 任何位置的变量。虽然我现在要求kmeans(...)我会对其他事情使用类似的过程,所以一个kmeans(...)特定的答案不能完全回答我的问题。
我喜欢的手册版本是:
kmeans_model <- kmeans(df[, -c(2:4, 6)], 10)
伪代码将是:
kmeans_model <- kmeans(df[, -c(colnames(is.na(df)))], 10)
另外,我不想删除df中的数据。提前谢谢。
(显然kmeans(...)不会对这个示例数据集起作用,但我无法重新创建真实数据集)
答案 0 :(得分:4)
以下是两个没有sapply
的选项:
kmeans_model <- kmeans(df[, !colSums(is.na(df))], 10)
或
kmeans_model <- kmeans(df[, colSums(is.na(df)) == 0], 10)
colSums(is.na(df))
计算每列的NAs数量,结果为:
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
的列进行子集化答案 1 :(得分:1)
这是我用于列出列名称及其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]