将 Haversine 结果作为双精度类型添加到数据集

Posted

技术标签:

【中文标题】将 Haversine 结果作为双精度类型添加到数据集【英文标题】:Adding Haversine results to dataset as a double type 【发布时间】:2021-06-27 13:07:14 【问题描述】:

我想在包含每次骑行距离的数据集中添加一个新列。为了计算这样的距离,我使用 hasrsine 公式使用每次旅行的起点和终点的给定坐标。

我在计算距离方面取得了成功,但在以我可以阅读的方式将该列添加到数据中时遇到了困难。

在不添加列的情况下,我得到一个 double 类型的临时列 (ride_distance)(如我所愿),显示如下所示的值:

filtered_dataset %>% rowwise() %>% 
   mutate(ride_distance=distHaversine(c(start_lon, start_lat), c(end_lon, end_lat)))

尝试将该列添加到我添加的数据时得到的结果:

filtered_dataset$ride_distance <- filtered_dataset %>%
   rowwise() %>% 
   mutate(distHaversine(c(start_lon, start_lat), c(end_lon, end_lat)))

使用 head() 读取该列的值我得到了这个,它们甚至没有显示为相同的值......:

如何将距离值作为双精度值添加到数据中,以便继续使用它进行计算?

【问题讨论】:

你能分享一段dput(head(data))的数据集吗? 你已经有了答案。您需要将值分配回数据集而不是一列。 filtered_dataset &lt;- filtered_dataset %&gt;% rowwise() %&gt;% mutate(ride_distance=distHaversine(c(start_lon, start_lat), c(end_lon, end_lat)))filtered_dataset &lt;- 是你所缺少的。 @RonakShah,作为答案发布? (“我未能将结果分配回原始变量名”是否存在规范重复?) 我不知道。感谢您的回答:) 【参考方案1】:

您将数据框(小标题)与小标题列混淆了。

这段代码:

filtered_dataset %>%
   rowwise() %>% 
   mutate(ride_distance = distHaversine(c(start_lon, start_lat), c(end_lon, end_lat)))

产生你想要的输出;如果你将它重新分配给filtered_dataset(即filtered_dataset &lt;- filtered_dataset %&gt;% ...),你会得到你想要的。您还可以使用 magrittr 包中的 %&lt;&gt;% 运算符,它同时分配和管道:filtered_dataset %&lt;&gt;% rowwise() %&gt;% ...

或者

filtered_dataset$ride_distance <- filtered_dataset %>%
   rowwise() %>% 
   mutate(x = distHaversine(c(start_lon, start_lat), c(end_lon, end_lat))) %>%
   pull(x)

会起作用的。

【讨论】:

以上是关于将 Haversine 结果作为双精度类型添加到数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何将双精度数更改为字符串

“查询结构与函数结果类型不匹配。返回类型双精度与第 1 列中的预期类型整数不匹配。”?

将列的数据类型从字符串转换为双精度

整数、长整数或双精度类型作为 Spark UDF 的函数参数

在 C# 中将十进制数转换为双精度数会产生差异

c语言 不同数据类型间的混合运算