如何删除包含NA值或方差为0的列?

3

在执行主成分分析(PCA)之前,我希望对数据进行缩放,但不幸的是,我发现有些列包含NA值,而且某些列的方差为0。因此,我想删除这些列。以下是我的数据示例:

df <- data.frame( v1 = 1:10 , v2 = rep( 0 , 10 ) , v3 = sample( c( 1:3 , NA ) , 10 , repl = TRUE ), v4 = 1:10 )

我希望同时删除v2v3列。如何实现?
我知道如何删除包含NA的列,然后删除方差为0的列。
colsd <- apply(df, 2, sd)
df2 <- df[!is.na(colsd)]
colsd2 <- apply(df2, 2, sd)
df3 <- df2[!colsd2 == 0]

但是看起来有些冗余,我只想知道是否可以更高效地实现,也许只需要一行代码。感谢任何回复。

1个回答

5
你可以尝试像这样做:

你可以尝试像这样做:

> df[!sapply(df, var) %in% c(0, NA)]
   v1 v4
1   1  1
2   2  2
3   3  3
4   4  4
5   5  5
6   6  6
7   7  7
8   8  8
9   9  9
10 10 10

1
啊...太好了,因为如果有任何NA值,var将返回NA。我曾考虑过一种更明确的更长的可能性,但这真是太聪明了。 - thelatemail
1
戴上我的超级挑剔帽子,我可能会指出 var(c(1.0000000000000001,rep(1,1e6))) == 0 返回 TRUE。但是这种微小的差异对于 PCA / FA 来说将是无用的。 - thelatemail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接