删除具有类似方差的列

时间:2013-08-15 13:17:17

标签: r function apply variance

我有一个3500 X 4000的数据帧。我正在尝试在R中编写一个专业命令来删除矩阵中显示相同方差的任何列。我可以用一个长而复杂的命令来做这个,比如

datavar <- apply(data, 2, var)
datavar <- datavar[!duplicated(datavar)]

然后通过匹配剩余的列名来组合我的数据,但这是SAD!我希望一次性做到这一点。我在考虑像

这样的东西
data <- data[, which(apply(data, 2, function(col) !any(var(data) = any(var(data)) )))] 

我知道上面命令的最后一部分是无意义的,但我也知道有些事情可以在某些...智能命令中完成!

以下是一些适用于问题的数据

data <- structure(list(V1 = c(3, 213, 1, 135, 5, 2323, 1231, 351, 1, 
33, 2, 213, 153, 132, 1321, 53, 1, 231, 351, 3135, 13), V2 = c(1, 
1, 1, 2, 3, 5, 13, 33, 53, 132, 135, 153, 213, 213, 231, 351, 
351, 1231, 1321, 2323, 3135), V3 = c(65, 41, 1, 53132, 1, 6451, 
3241, 561, 321, 534, 31, 135, 1, 1351, 31, 351, 31, 31, 3212, 
3132, 1), V4 = c(2, 2, 5, 4654, 5641, 21, 21, 1, 1, 465, 31, 
4, 651, 35153, 13, 132, 123, 1231, 321, 321, 5), V5 = c(23, 13, 
213, 135, 15341, 564, 564, 8, 464, 8, 484, 6546, 132, 165, 123, 
135, 132, 132, 123, 123, 2), V6 = c(2, 1, 84, 86468, 464, 18, 
45, 55, 2, 5, 12, 4512, 5, 123, 132465, 12, 456, 15, 45, 123213, 
12), V7 = c(1, 2, 2, 5, 5, 12, 12, 12, 15, 18, 45, 45, 55, 84, 
123, 456, 464, 4512, 86468, 123213, 132465)), .Names = c("V1", 
"V2", "V3", "V4", "V5", "V6", "V7"), row.names = c(NA, 21L), class = "data.frame")

我是否也可以保留其中一个“类似方差”列?

谢谢,

3 个答案:

答案 0 :(得分:3)

我可能会采取更谨慎的路线,例如

data[, !duplicated(round(sapply(data,var),your_precision_here))]

答案 1 :(得分:2)

这与你提出的非常类似:

vars <- lapply(data,var)
data[,which(sapply(1:length(vars), function(x) !vars[x] %in% vars[-x]))]

要考虑的一件事是你是想要完全匹配差异(如本例所示),还是只想接近差异。后者将是一个更具挑战性的问题。

答案 2 :(得分:1)

......或作为替代方案:

data[ , !c(duplicated(apply(data, 2, var)) | duplicated(apply(data, 2, var), fromLast=TRUE))]

......但也不短:)