首页 > 解决方案 > 找到聚合向量元素的一般方法

问题描述

我有一个正好包含 5 个元素的向量。向量的元素包含大于 100 和小于 100 的数字。这些元素表示空间中某个区域的点数。

我想找到一种将小于 100 的元素与其邻居聚合的一般方法。

规则如下:

  1. 我只能加入邻居(2 是 1 的邻居,3 和 1 是 2 的邻居,4 是 5 的唯一邻居......)。

  2. 我不能聚合超过 3 个元素。因此,例如,如果向量的元素 1、2、3、4 都小于 100,我只能在它们之间聚合 1、2、3 或 2、3、4(而不是 5,因为这又会更多大于 3)。

  3. 如果要聚合的元素是 1、2、4,我可以做的是将 1 和 2 与 3 聚合,将 5 与 4 聚合。

我正在尝试编写一个通用函数来执行此操作,但目前我所做的是生成所有可能的组合并告诉 R 在每种情况下要做什么(就像我在上面所做的那样),这既冗长又乏味。

例如:

v = c(100, 30, 50, 100, 20)

所以在这种情况下,我的结果是:

v1 = c(130, 170) 

来自聚合元素 (1+2, 3+4+5)。

一般来说,聚合方法可能不止一种,具体取决于每一侧的邻居。

关于如何巧妙地写出来的任何创意?

标签: rvectoraggregate

解决方案


不是很优雅,但我认为它会起作用:

v = c(100, 30, 50, 100, 20)
v2 <- v
which_ <- which(v == 100)
v2[which_]   <- seq(sum(v==100))
v2[which_-1] <- seq(sum(v==100))[which_-1 != 0]
v2[(which_+1)[which_+1 <= length(v2)]] <- seq(sum(v==100))[which_+1 <= length(v)]
aggregate(v,list(v2),sum)$x
# [1] 130 170

推荐阅读