【问题标题】:Make all elements of a vector different使向量的所有元素不同
【发布时间】:2021-05-16 19:08:58
【问题描述】:

我有一个向量(特别是包含 770 个元素),其中一些是重复的。我希望他们都与众不同。我开发了一个代码(一个简单的循环),当两个位置保持相同的数字时求和 0.0000001,以使值略有不同。但是,代码不起作用,我不知道如何更正它。当超过 2 个连续的位置保持相同的值时,它会失败。

我确信这将是一个相当简单的解决方案,但我似乎找不到它。 R中的代码。

for (i in 1:769) {
  if (grid.x[i] == grid.x[i+1]) {
    grid.x[i+1] <- grid.x[i+1] + 0.0000001
  }
}

【问题讨论】:

  • 如果两个以上的向量元素相同,则添加 0.0000001 可能不会总是打破平局。您是否考虑添加一个小的随机数? rnorm(1,0,1e-4)

标签: r loops sum


【解决方案1】:

另一个ave 版本

> vec + 1e-4 * (ave(vec, vec, FUN = seq_along) - 1)
[1] 1.0000 2.0000 3.0000 4.0000 3.0001 3.0002 4.0001

【讨论】:

  • 这是我的答案的优化版本,很好的改进!
【解决方案2】:

试试这个:

vec <- c(1,2,3,4,3,3,4)
ave(vec, vec, FUN=function(z) z+(seq_along(z)-1)*1e-4)
# [1] 1.0000 2.0000 3.0000 4.0000 3.0001 3.0002 4.0001

请注意3s 有增量添加。我用了1e-4,你可以选择更小的。

【讨论】:

  • ave(vec, vec, FUN = function(x) seq(x[1], by = 0.0001, length = length(x)))
【解决方案3】:

我们可以使用make.unique

as.numeric(make.unique(as.character(vec)))
#[1] 1.0 2.0 3.0 4.0 3.1 3.2 4.1

数据

vec <- c(1, 2, 3, 4, 3, 3, 4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2012-09-18
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多