У меня есть фрейм данных в 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

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

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

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

r
0
doug 20 Сен 2018 в 05:01

2 ответа

Лучший ответ

Вы хотите использовать функцию 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
0
Paul 20 Сен 2018 в 02:54

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

  distances = apply(trainData, 1, function(x) dist(rbind(x0,x)))
0
doug 3 Окт 2018 в 18:21