如何在R中两个数据帧之间循环进行行检查?

时间:2019-07-08 15:01:58

标签: r loops

我想循环一些代码,以检查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行的正确信息。我希望能够对所有75行df3运行它。

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

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

1 个答案:

答案 0 :(得分:0)

首先,我建议阅读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系列(在这种情况下,{{ 1}})。我强烈建议您使用后者,因为它更健壮。