Как добиться этого для цикла в R? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь написать цикл 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 ]

1 голос
/ 13 мая 2019

Обычно в 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)
0 голосов
/ 13 мая 2019

Как насчет этого, я думаю, outer подходит для вашей проблемы.

СЛУЧАЙ 1 (XY)

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...