我有一个像这样的数据框:
df <- data.frame(a = runif(100, -10, 10),
b = runif(100, -10, 10),
c = runif(100, -10, 10),
d = runif(100, -10, 10),
e = runif(100, -10, 10))
现在,我想要一个以最大分散度提取 n 行的函数。
为了更好地解释,想象一个像
c(1:9)
这样的一维数据集。我正在寻找的函数类似于 fun(3, c(1:9))
(n=3)并返回 c(1, 5, 9)
。 fun(5, c(1:9))
将返回 c(1, 3, 5, 7, 9)
。
fun(3, c(1:10))
的有效结果为 c(1, 5, 10)
或 c(1, 6, 9)
。在这种情况下,该函数应随机选择有效输出之一。
不久前,我写过这样的文章:
voronoiFilter <- function(occ, select){
n <- nrow(occ) - select
subset <- occ
dropped <- rep(NA, n)
for (i in 1:n) {
v <- voronoi.mosaic(x = subset[,1], y = subset[,2], duplicate = "remove")
info <- cells(v)
areas <- unlist(lapply(info,function(x) x$area))
smallest <- which(areas == min(areas, na.rm = TRUE))
dropped[i] <- which(occ[,1] == subset[smallest,1] & occ[,2] == subset[smallest,2])
subset <- subset[-smallest,]
}
outVec <- 1:nrow(occ)
return(outVec[-dropped])
}
其中
occ
是输入数据帧,selected
是 n。
这有时工作正常,但我经常收到此错误:
Warning in hist.default(i, plot = FALSE, freq = TRUE, breaks = seq(0.5, :
argument ‘freq’ is not made use of
我认为是因为数据中有重复的元素。
有人有其他想法吗,这样的函数会是什么样子?
我不知道你如何定义“分散”,但我希望下面的代码能给你一些提示。
假设将方差用作“分散”的度量,您可以定义一个递归函数
f
,如下所示
f <- function(S, v = range(S), n = 5) {
if (length(v) == n) {
return(v)
}
S <- S[!S %in% v]
idx <- which.max(colSums(abs(outer(v, S, `-`))^2))
Recall(S[-idx], n = n, v = sort(c(S[idx], v)))
}
输出看起来像
> set.seed(0)
> (S <- rnorm(10))
[1] 1.262954285 -0.326233361 1.329799263 1.272429321 0.414641434
[6] -1.539950042 -0.928567035 -0.294720447 -0.005767173 2.404653389
> f(S, n = 3)
[1] -1.539950 -0.928567 2.404653
我们可以验证上述输出使方差最大化
> combn(S, 3)[, which.max(combn(S, 3, var))]
[1] -1.539950 -0.928567 2.404653