向量化嵌套循环,R

时间:2019-09-30 09:22:42

标签: r vector vectorization nested-loops

实际上,我想从另一个矢量“数据”创建一个矢量“比较”。 我想将“数据”中的每个元素与自己以及向量中后面的所有元素进行比较。如果有平局,我将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)
     }
  }
}

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

3 个答案:

答案 0 :(得分:3)

我们可以使用react-hooks-testing-library

dist

答案 1 :(得分:2)

我们可以使用outer来将data与自身进行比较,然后提取下三角数据,以便仅输出遵循当前值的数据。

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

答案 2 :(得分:1)

您可以对索引使用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将布尔值转换为整数。