我有一个矩阵数量的观测值和矩阵数量,我想删除所有零列,然后我尝试使用nearZeroVar(数据集(。
removeColumns <-nearZeroVar(datset) # remove zeros
testT <- datset[, -removeColumns]
但还有另一种方法,那就是
removeZeros <- apply(dataset, 2, function(x) length(unique(x)) == 1)
dataset<- datset[, !removeZeros];
它在小矢量中给了我同样的结果
mdat <- matrix(c(1,2,3,0,4,5, 0,0,0,0, 0,0,3,0,0,0,0,0,0,0,1,2,3,0), nrow = 6, ncol = 4, byrow = TRUE)
"
[,1] [,2] [,3] [,4]
[1,] 1 2 3 0
[2,] 4 5 0 0
[3,] 0 0 0 0
[4,] 3 0 0 0
[5,] 0 0 0 0
[6,] 1 2 3 0
"
cols_mdat <-nearZeroVar(mdat)
"4"
mdat_remove <-mdat[,-cols_mdat]
"[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 0
[3,] 0 0 0
[4,] 3 0 0
[5,] 0 0 0
[6,] 1 2 3
"
mdatzv <- apply(mdat, 2, function(x) length(unique(x)) == 1);
mdat_nzv <- mdat[, !mdatzv];
"
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 0
[3,] 0 0 0
[4,] 3 0 0
[5,] 0 0 0
[6,] 1 2 3
"
但在我的数据集中,有785个特征和大约4200个观测值,它返回了不同数量的特征。
你能告诉我这两种方式有什么区别吗?
第二个例子只是删除列中有一个唯一值的列。考虑一下:
mdat <- matrix(c(100,100,100,100,100,100, 0,0,0,0, 0,0,3,0,0,0,0,0,0,0,1,2,3,0), nrow = 6, ncol = 4, byrow = FALSE)
mdat
# [,1] [,2] [,3] [,4]
#[1,] 100 0 3 0
#[2,] 100 0 0 0
#[3,] 100 0 0 1
#[4,] 100 0 0 2
#[5,] 100 0 0 3
#[6,] 100 0 0 0
mdat[ , !apply(mdat, 2, function(x) length(unique(x)) == 1) ]
# [,1] [,2]
#[1,] 3 0
#[2,] 0 0
#[3,] 0 1
#[4,] 0 2
#[5,] 0 3
#[6,] 0 0
值是否接近零并不重要,如果列中只有一个唯一值,则逻辑比较==
返回TRUE
,而!
运算符表示我们排除列。
另一方面,nearZeroVar
删除了具有唯一值的列,但也删除了相对于观测总数具有非常少的唯一值,并且其中最常见值与下一个最常见值的比率较大(即高度过分散(的列。现在考虑相同的数据,但如果我们将最常见值与下一个最常见值的比率设置得足够低,并且将唯一值占样本总数的百分比的截止值设置得足够高,那么这些列也将被选择:
nearZeroVar( mdat , freqCut = 4 , uniqueCut = 40 )
#[1] 1 2 3
列1&3被选中,因为它们包含1个值。之所以选择第二列,是因为大多数列值(0
(与次常见值(3
(的比率为5:1,这大于4的截止值,并且该列中唯一值的数量(2个值,0
和3
(占观察总数(6
行(的百分比为2/6*100
为33%,这是<我们为唯一切割指定的CCD_ 11。