总结R中循环的结果?

时间:2012-08-16 14:17:38

标签: r loops summarization

我已经创建了这个小代码并且总结了循环结果的麻烦。有人可以帮我吗?

a = array(c(1,1,1,1,1,1,1,2,1,1,1,1,1), dim=c(4,3))
b = array(c(0,0,0,0,0,1), dim=c(2,3))

dist <- array()
for (j in 1:2) { 
  for (i in 1:4) {
  dist <- sqrt (sum ((a[i, ]-b[j, ])^2))
  print(dist)
  }
}

我得到8个数字,但只能显示最后一个

3 个答案:

答案 0 :(得分:4)

或者,您可以使用outer函数(如果有人想出一种更好的方法来矢量化匿名函数,请随时编辑)

(dist <- outer(1:4, 1:2, FUN = Vectorize(function(x,y)sqrt(sum((a[x,]-b[y,])^2)))))
         [,1]     [,2]
[1,] 1.732051 1.414214
[2,] 1.732051 1.414214
[3,] 1.732051 1.414214
[4,] 2.449490 2.236068

1:4用于索引a1:2用于索引b

答案 1 :(得分:3)

您需要随时填写dist矩阵。

dist <- array(dim=c(4,2))
for (j in 1:2) {
  for (i in 1:4) {
    dist[i,j] <- sqrt (sum ((a[i,1:3]-b[j,1:3])^2))
  } 
}
dist

答案 2 :(得分:2)

您还可以使用内置的dist函数并避免所有这些嵌套for循环

dist计算欧氏距离(可能性的默认值)。这似乎是你想要的。

有关详细信息,请参阅?dist

# give a and b some rownames

row.names(a)  <- paste0('a',1:nrow(a))
row.names(b)  <- paste0('b',1:nrow(b))
#combine into one matrix
ab <- rbind(a,b)

# get the distance between the points

distances <- as.matrix(dist(ab))

# subset those you are interested in
distances[row.names(a),row.names(b)]

##           b1       b2
## a1 1.732051 1.414214
## a2 1.732051 1.414214
## a3 1.732051 1.414214
## a4 2.449490 2.236068