从数据框中选择散度最大的 n 行

问题描述 投票:0回答:1

我有一个像这样的数据框:

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

我认为是因为数据中有重复的元素。

有人有其他想法吗,这样的函数会是什么样子?

r
1个回答
0
投票

我不知道你如何定义“分散”,但我希望下面的代码能给你一些提示。

假设将方差用作“分散”的度量,您可以定义一个递归函数

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
© www.soinside.com 2019 - 2024. All rights reserved.