невозможно зациклить индекс строки фрейма данных в R - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть кадр данных в R размером nx4.Я пытаюсь пройтись по нему и выполнить вычисление для добавления к вектору «расстояний».x0 - это вектор длины 3. Я пытаюсь запустить следующий код

trainData = data.frame(x1,x2,x3,y)

for (j in 1:n) {
    distances[j] = sqrt(sum((x0 - trainData[j,1:3])^2))
}

Я получаю следующую ошибку:

Error in Ops.data.frame(x0, trainData[j, 1:3]) : 
  ‘-’ only defined for equally-sized data frames

Однако вычитаемые 2 значения имеют одинаковую длинуи я могу запустить его без зацикливания, то есть

sqrt(sum((x0 - trainData[1,1:3])^2))

Я не могу найти причину этого, любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Я не уверен, в чем заключалась первоначальная проблема, но у меня все работает, следуя совету Пола и заменяя цикл на:

  distances = apply(trainData, 1, function(x) dist(rbind(x0,x)))
0 голосов
/ 20 сентября 2018

Вы хотите использовать функцию dist() для расчета расстояния.Кроме того, избегайте использования циклов и посмотрите на семейство функций apply.

library(dplyr)

set.seed(1724)
trainData <- data.frame(x1 = runif(4, 1, 10), x2 = runif(4, 1, 10), x3 = runif(4, 1, 10), y = runif(4, 1, 10))

mutate(trainData,
       dist = apply(trainData,
                    1,
                    function(x, y = runif(3, 1, 10)) {
                      dist(rbind(x[1:3], y), method = "euclidean")
                    }))

#         x1       x2       x3        y      dist
# 1 5.890667 7.156956 6.946917 6.580706  6.188533
# 2 3.060810 1.117295 7.676836 7.965404  5.193822
# 3 8.058110 5.518819 2.687567 3.832825 10.520283
# 4 8.405847 1.326119 3.533277 6.804517  8.390918
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...