1

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

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

然后通过匹配剩余的列名来组装我的数据,但这是可悲的!我希望一次性做到这一点。我在想类似的东西

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")

我也可以保留“相似方差”列之一吗?

谢谢,

4

3 回答 3

3

我可能会走更谨慎的路线,比如

data[, !duplicated(round(sapply(data,var),your_precision_here))]
于 2013-08-15T13:51:43.203 回答
2

这与您提出的非常相似:

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

但是要考虑的一件事是,您是要精确匹配方差(如本例所示)还是仅匹配接近的方差。后者将是一个更具挑战性的问题。

于 2013-08-15T13:40:12.547 回答
1

...或作为替代方案:

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

...但也不短:)

于 2013-08-15T13:47:32.850 回答