【问题标题】:Comparing Vector Values比较向量值
【发布时间】:2013-08-05 15:15:51
【问题描述】:

`我想知道如何更改此代码,以使两个向量的对应值不能相等。例如:如果 x = (1, 2, 2, 4, 8, 1, 7, 9, 5, 10) 并且 y = (3, 2, 7, 8, 4, 10, 4, 8, 2, 1),两个向量的第二个值等于 2。有什么办法可以告诉 R 在向量 x 的第二个点重新采样,直到它与向量 y 中的值不同?

x <- c(1:10)
y <- c(1:10)
sample_x <- sample(x, length(10), replace = TRUE)
z <- sample_x > y`

【问题讨论】:

  • length(10)1,您的代码有些奇怪。 sample_x &gt; y 也没有多大意义。
  • OP 代码中的 sample_x 的大小为 1,因此 sample_x &gt; y 将针对 y 中的每个值检查 sample_x。 (我确定不是预期的,但会运行良好)
  • 我在想 length(10) 会创建一个长度为 10 的向量,但我想不会。我试图在替换值时从 x 采样 10 次。因此,z 会给我 TRUE 或 FALSE,具体取决于 sample_x 中的值是否大于向量 y 中的对应值。
  • 旁注:要获得长度为n整数的向量,请使用seq(n)
  • 所以你的意思是sample_x &lt;- sample(x, 10, replace = TRUE) 也可能是z &lt;- sample_x == yz &lt;- any(sample_x == y)

标签: r vector random-sample


【解决方案1】:

你可以这样做:

while(any(x == y)) x <- sample(x)

编辑:现在我意识到xy 可能来自与sample 类似的调用replace = TRUE,这是一种避免while 循环的有趣方法。它使用索引和模来确保两个样本不匹配:

N <- 1:10  # vector to choose from (assumes distinct values)
L <- 20    # sample size - this might be length(N) as in your example

n <- length(N)

i <- sample(n,   L, replace = TRUE)
j <- sample(n-1, L, replace = TRUE)

x <- N[i]
y <- N[1 + (i + j - 1) %% n]

【讨论】:

    【解决方案2】:
    while (any(ind <- x==y))
       x[ind] <- sample(N, sum(ind), TRUE)
    

    N 是您从中采样的对象(或最大整数)

    这里的好处是,如果您不需要重新采样所有x,那么这将更快地收敛。

    【讨论】:

      【解决方案3】:

      您可以使用库组合中的函数 permn 来生成长度为 10 的向量的所有排列。

      ind <- permn(10)
      xy_any_equal <- sapply(ind, function(i) any(x[i] == y))
      if(sum(xy_any_equal) < length(xy_any_equal)) x_perm <- x[head(ind[!xy_any_equal],1)[[1]]]
      exists(x_perm)
      

      【讨论】:

      • 认真的吗?你会推荐这两个已经发布的解决方案吗?
      • vector超过7的时候不推荐。
      猜你喜欢
      • 2013-02-09
      • 1970-01-01
      • 2012-10-04
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多