如何计算R中三维坐标系中两点之间的距离
我试图计算三维坐标系中两点之间的距离。我有两点:1)“释放”(x,y,z),2)“重新捕获”(x,y,z)。我想计算每一个重新捕获的个体这两点之间的欧几里德距离 我在R中导入的数据集如下所示:如何计算R中三维坐标系中两点之间的距离,r,euclidean-distance,R,Euclidean Distance,我试图计算三维坐标系中两点之间的距离。我有两点:1)“释放”(x,y,z),2)“重新捕获”(x,y,z)。我想计算每一个重新捕获的个体这两点之间的欧几里德距离 我在R中导入的数据集如下所示: | | Rel_x | Rel_y | Rel_z | Rec_x | Rec_y | Rec_z | Distance | |--------------|---------|---------|--------|---------|---------|--
| | Rel_x | Rel_y | Rel_z | Rec_x | Rec_y | Rec_z | Distance |
|--------------|---------|---------|--------|---------|---------|--------|----------|
| Individual_1 | 231.114 | 177.002 | 17.329 | 228.288 | 178.908 | 17.243 | ? |
| Individual_2 | 239.028 | 178.789 | 16.526 | 239.057 | 178.706 | 16.499 | ? |
| Individual_3 | 212.109 | 210.142 | 18.791 | 212.300 | 208.693 | 18.372 | ? |
我还想添加一列(距离)来报告两点“释放”和“重新捕获”之间的欧几里德距离
我尝试过使用dist()函数,但我不确定我的代码行是否正确,例如
dist (data_set), method = "euclidean", diag = FALSE, upper = FALSE, p = 2)
当我运行这行代码时,我收到以下信息:
Warning message: In dist(data_set) : NAS introduced by coercion
您有什么建议吗?将数据帧一分为二,分别用于每个点的释放和重新捕获,然后计算欧几里德度量 例如,假设您的数据帧名为
df
,前三列表示第一个点,后三列表示第二个点:
sqrt(rowSums(((df[,1:3]-df[,4:6])^2))
将数据帧一分为二,分别用于每个点的释放和重新捕获,然后计算欧几里德度量 例如,假设您的数据帧名为
df
,前三列表示第一个点,后三列表示第二个点:
sqrt(rowSums(((df[,1:3]-df[,4:6])^2))
我建议你把它写下来。调用您的数据
data\u set
我们可以将另一个答案调整为有效答案:
data_set$distance = sqrt(rowSums((data_set[, 1:3] - data_set[, 4:6])^2))
更安全的方法是命名列,而不是依赖于位置顺序:
data_set$distance = sqrt(rowSums(
(data_set[, c('Rel_x', 'Rel_y', 'Rel_z')] - data_set[, c('Rec_x', 'Rec_y', 'Rec_z')])^2
))
我建议你把它写下来。调用您的数据
data\u set
我们可以将另一个答案调整为有效答案:
data_set$distance = sqrt(rowSums((data_set[, 1:3] - data_set[, 4:6])^2))
更安全的方法是命名列,而不是依赖于位置顺序:
data_set$distance = sqrt(rowSums(
(data_set[, c('Rel_x', 'Rel_y', 'Rel_z')] - data_set[, c('Rec_x', 'Rec_y', 'Rec_z')])^2
))
dist
函数是专门设计用来创建距离矩阵的,你给它一个点列表,它给你一个矩阵,每个可能的点对之间的距离——这不是你的输入看起来像什么,也不是你想要的输出,这就是为什么你的dist()
尝试不起作用。嗨,感谢您澄清@Gregor.dist
函数是专门设计用来创建距离矩阵的,您可以给它一个点列表,它会给您一个矩阵,其中包含每个可能的点对之间的距离——这不是您的输入看起来的样子,也不是您想要的输出,这就是为什么您的dist()
尝试不起作用。您好,感谢您在@Gregor清除该问题。sum
无法跨行工作-这将给出一个数字答案,而不是距离向量。替换为rowSums
,我觉得你很好嗨,谢谢你的帮助。我刚刚尝试运行您建议的代码行,收到了以下消息:“df[,1:3]中的错误:类型为“closure”的对象不可subsettable”。此错误消息是什么意思?我尝试使用rowsum而不是sum,收到了以下消息:“Error in UseMethod(“[”):没有适用于的方法”['应用于“函数”类的对象。@MeghanLWharton人们在本网站回答问题时经常使用df
来引用数据框。您需要使用此答案使用的数据框的任何名称df
(看起来您在问题中称之为data\u set
)同时,请确保你用<代码> RooSoS> <代码>替换<代码> >代码> S/<代码>在中间和rowSums
我觉得你很好嗨,谢谢你的帮助。我刚刚尝试运行了你建议的代码行,我收到了以下消息:“df中出错。”[,1:3):类型为“closure”的对象不可子集。此错误消息是什么意思?我已尝试使用rowsum而不是sum,并收到以下消息:“error in UseMethod(“[”):没有适用于“[”类的对象的适用方法”function““@MeghanLWharton人们在本网站上回答问题时经常使用df
来指代数据框。您需要使用此答案使用的数据框的名称df
(看起来您在问题中称之为data\u set
)同时,请确保你用<代码> > RooSuth<代码>替换<代码> >代码> S/<代码>在中间和$Oops中的错误,我的错误。我忘记了用)
关闭我的名称向量。现在应该可以了。不用担心,非常感谢您的帮助!代码行现在可以工作了!嗨,我已经尝试运行您建议的代码行来命名列,而不是依赖于位置顺序,我很高兴ep收到以下消息:“错误在$Oops,我的错误。我忘记了关闭我的名字向量的)
。现在应该可以工作了。不用担心,非常感谢您的帮助!代码行现在可以工作了!