我想循环一些代码,以检查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])
答案 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}})。我强烈建议您使用后者,因为它更健壮。