如何计算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 | |--------------|---------|---------|--------|---------|---------|--

我试图计算三维坐标系中两点之间的距离。我有两点:1)“释放”(x,y,z),2)“重新捕获”(x,y,z)。我想计算每一个重新捕获的个体这两点之间的欧几里德距离

我在R中导入的数据集如下所示:

|              | 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/<代码>在中间和 S/<代码>结尾。嗨,Gregor,非常感谢你的帮助。“RoSoMy”起到了一种魅力!<代码>和<代码>将不会跨行工作。这将给出一个单数答案,而不是一个距离向量。
rowSums
我觉得你很好嗨,谢谢你的帮助。我刚刚尝试运行了你建议的代码行,我收到了以下消息:“df中出错。”[,1:3):类型为“closure”的对象不可子集。此错误消息是什么意思?我已尝试使用rowsum而不是sum,并收到以下消息:“error in UseMethod(“[”):没有适用于“[”类的对象的适用方法”function““@MeghanLWharton人们在本网站上回答问题时经常使用
df
来指代数据框。您需要使用此答案使用的数据框的名称
df
(看起来您在问题中称之为
data\u set
)同时,请确保你用<代码> > RooSuth<代码>替换<代码> >代码> S/<代码>在中间和 S/<代码>结尾。嗨,Gregor,非常感谢你的帮助。d我一直收到以下消息:“
$Oops中的错误,我的错误。我忘记了用
关闭我的名称向量。现在应该可以了。不用担心,非常感谢您的帮助!代码行现在可以工作了!嗨,我已经尝试运行您建议的代码行来命名列,而不是依赖于位置顺序,我很高兴ep收到以下消息:“错误在
$Oops,我的错误。我忘记了关闭我的名字向量的
。现在应该可以工作了。不用担心,非常感谢您的帮助!代码行现在可以工作了!