如何在R中实现此for循环?

时间:2019-05-13 08:23:21

标签: r for-loop dataset

我正在尝试编写数据集的for循环。为了简单起见,我将写一个示例:

 Two variables, X and Y.
         X = 3, 6, 9
         Y = 4, 8, 12

我想做一个循环来做到这一点:

   (Xi - Yi)^2, so first (3-4)^2, then 
   (6-8)^2 and so on.

然后,将其乘以:

   ((1/2)/(n*(n-1))).

在此示例中,它将是:

     (3-4)^2 + (6-8)^2 + (9-12)^2 = 1 + 4 + 9 = 14
     1/2 / (3*(3-1)) = 0.5 / 6 = 0.0833.
     0.0833 * 14 = 1.166.

    result <- 0
    sum <- rep(NA, n)
        for (i in (1:n)) {
          for(j in (1:n)) {
          sum <- ((gathered$X[i] - gathered$X[j])^2)
     }
      }

2 个答案:

答案 0 :(得分:1)

通常,在R中,大多数时候可以避免for循环。您可以的话

sum((X - Y)^2) * (1/2)/(length(X) * (length(X) - 1))
#[1] 1.166666667

但是,就for循环而言,您应该使用单个循环,因为您想一起访问X[i]Y[i]

sum <- 0
n <- 3
for (i in (1:n)) {
    sum <- sum + (X[i] - Y[i])^2
 }
sum * (1/2)/(n*(n-1))
#[1] 1.1667

数据

X = c(3, 6, 9)
Y = c(4, 8, 12)

答案 1 :(得分:0)

我认为outer适合您的问题。

案例1(X-Y)

sum(diag(outer(X,Y,function(X,Y)(X-Y)^2))) *
 (1/2)/(length(X) * (length(X) - 1))
1.166667

案例2(所有X和Y计算)

sum(outer(X,Y,function(X,Y)(X-Y)^2)) *
(1/2)/(length(X) * (length(X) - 1))
15.5