我有一个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")
我是否也可以保留其中一个“类似方差”列?
谢谢,
答案 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))]
......但也不短:)