我在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))
我找不到原因,我们将为您提供帮助。
答案 0 :(得分:0)
您要使用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
答案 1 :(得分:0)
我不确定最初的问题是什么,但是通过听取Paul的建议并将循环替换为:
distances = apply(trainData, 1, function(x) dist(rbind(x0,x)))