【问题标题】:Vectorize nested for loop, R向量化嵌套for循环,R
【发布时间】:2020-01-29 13:46:42
【问题描述】:

实际上,我想从另一个向量“数据”创建一个向量“比较”。 我想将“数据”中的每个元素与他自己以及向量中跟随的所有元素进行比较。如果有平局,我将 1 附加到“比较”,否则我附加 0。 例如:

data=c(3,6,7,3)
# I compare 3 to 3, 6, 7 and 3
# Then I compare 6 to 6, 7, and 3
# Then 7 to 7 an 3
# Then 3 to 3 so I get
compare=c(1,0,0,1,1,0,0,1,0,1)

这是我所做的:

for(i in 1:length(data))
{
  for(j in 0:(length(data)-i))
  {
     if (data[i]==data[i+j])
     {
        compare=append(compare,1)
     }
     else
     {
        compare=append(compare,0)
     }
  }
}

有什么方法可以将向量元素之间的这种比较向量化?

【问题讨论】:

    标签: r vector vectorization nested-loops


    【解决方案1】:

    我们可以使用dist:

    data=c(3,6,7,3)
    res <- as.matrix(dist(data))
    res <- res < .Machine$double.eps #find elements with distance of 0
    diag(res) <- 1
    res[lower.tri(res, TRUE)]
    #[1] 1 0 0 1 1 0 0 1 0 1
    

    【讨论】:

      【解决方案2】:

      我们可以使用outerdata与自身进行比较,然后提取下三角数据,这样我们就可以只输出当前值之后的数据。

      mat <- +(outer(data, data, `==`))
      mat[lower.tri(mat, diag = TRUE)]
      #[1] 1 0 0 1 1 0 0 1 0 1
      

      【讨论】:

        【解决方案3】:

        您可以在索引上使用 sapply:

        as.numeric(unlist(sapply(1:length(data), function(k) data[k] == data[k:length(data)])))
        [1] 1 0 0 1 1 0 0 1 0 1
        

        索引 k 的当前值与所有等于或等于 k ​​的值进行比较。 unlist 允许连接每次迭代 k 的结果。最后as.numeric将布尔值转换为整数。

        【讨论】:

          猜你喜欢
          • 2019-07-22
          • 1970-01-01
          • 1970-01-01
          • 2013-03-03
          • 2021-07-29
          • 1970-01-01
          • 2013-12-06
          • 1970-01-01
          相关资源
          最近更新 更多