【问题标题】:How can I loop down a row check between two data frames in R?如何在 R 中的两个数据帧之间循环进行行检查?
【发布时间】:2019-07-09 01:48:55
【问题描述】:

我想循环一些代码,检查 df1 的一行的纬度和经度与 df2 的所有纬度和经度行的距离,然后过滤小于 500 的距离。然后我想放弃向下到 df1 的下一行并执行相同的任务。

我可以在第一行实现它,但我没有成功循环它。

我已经尝试将它包装在一个循环函数中:

for (i in nrow(df3$value)){ 
df <- df2 %>% 
  filter(distHaversine(c(Longitude, Latitude), c(df3$Longitude[i], df3$Latitude[i])) <= 500)

df <- data.frame(df, df3$value[i])

}

但这并没有成功。

以下代码在复制到控制台时返回,针对 df3 的 1 行返回正确信息。我希望能够对 df3 的所有 75 行运行它。

df <- df2 %>% 
  filter(distHaversine(c(Longitude, Latitude), c(df3$Longitude[1], df3$Latitude[1])) <= 500)

df <- data.frame(df, df3$value[1])

【问题讨论】:

    标签: r loops


    【解决方案1】:

    首先,我建议阅读this Q&A about reproducible examples 来编写您未来的问题。例如,我不知道您为 distHaversine 函数使用的包是什么,所以我不能确定它的参数。你越容易让别人回答你的问题,你就越有可能得到你需要的答案。

    for 循环调用有几个错误:

    • 您需要使用一个数字序列来循环,而不是单个数字
    • nrow() 用于二维数组,如矩阵或数据帧。对于像df3$value 这样的向量,您必须使用length()。假设df3 是一个data.frame 对象,您可以轻松检查nrow(df3$value) 是否返回NULL。

    所以,您的问题更基本:for 循环调用甚至没有运行。这就是为什么你的第二个代码块给你想要的结果,但第一个没有。

    for(i in 1:nrow(df3)) { }
    
    # or
    
    for(i in 1:length(df3$x)) { }
    
    # or (maybe better)
    
    for(i in seq_along(df3$value)) { }
    

    但是,我认为在编写 R 代码时应该避免使用 for 循环。它没有任何问题,但您应该滥用 R 的函数式编程和矢量化解决方案以获得简洁高效的代码。

    例如,您可以基于第二个代码编写一个函数,并将其与lapply 函数或purrr 包的map 系列(在本例中为purrr::map_dfr())组合。我强烈建议使用后者,因为它更强大。

    【讨论】:

    • 感谢您的回复!我想我一定要研究 map_dfr()。我现在对此有点困惑,但如果我仍然感到困惑,我会考虑制作一个 reprex 并回来!感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 2021-12-27
    • 1970-01-01
    • 2022-01-08
    • 2020-11-30
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多