在R中,我有两个包含随机坐标的 Dataframe :
# Load the geosphere library
library(geosphere)
set.seed(123)
# Set the number of rows in each data frame
n1 <- 20
n2 <- 30
# Set the mean longitude and latitude for New York
lon_mean <- -74.0060
lat_mean <- 40.7128
# Set the standard deviation for the longitude and latitude
lon_sd <- 0.1
lat_sd <- 0.1
# Simulate random data for df_1
df_1 <- data.frame(
lon = rnorm(n1, lon_mean, lon_sd),
lat = rnorm(n1, lat_mean, lat_sd)
)
# Simulate random data for df_2
df_2 <- data.frame(
lon = rnorm(n2, lon_mean, lon_sd),
lat = rnorm(n2, lat_mean, lat_sd)
)
# Remove duplicate rows from df_1
df_1_unique <- unique(df_1)
**我的问题:**对于df_1中的每个唯一坐标,我想计算该坐标与df_2中所有坐标之间的地理距离。
我试着用一个循环程序来实现:
# Initialize an empty list to store the result
result <- vector("list", nrow(df_1))
# Calculate the distances
for (i in 1:nrow(df_1)) {
# Initialize an empty vector to store the distances for the i-th coordinate in df_1
distances <- numeric(nrow(df_2))
for (j in 1:nrow(df_2)) {
# Calculate the distance between the i-th coordinate in df_1 and the j-th coordinate in df_2
distances[j] <- distHaversine(c(df_1[i, "lon"], df_1[i, "lat"]), c(df_2[j, "lon"], df_2[j, "lat"]))
}
# Store the distances for the i-th coordinate in df_1 in the result list
result[[i]] <- distances
print(result[[i]])
}
#####
end = list()
for (i in 1:length(result))
{
end[[i]] = data.frame(id = seq_along(result[[i]]), values = result[[i]], iteration = i)
}
final <- do.call(rbind, end)
现在,对于这个最终结果,我尝试添加4列:
- 长1
- lat_1
- 长2
- lat_2
也就是说,当final$iteration == i
时,则long_1 = df_1[i,1]
和lat_1 = df_1[1,i]
。并且,long_2 = df_2[1,j]
和lat_1 = df_1[j,1]
。
我试着用下面的代码来完成这个任务:
# get unique values of iteration
iterations <- unique(final$iteration)
# create new columns for each unique value of iteration
for (i in iterations) {
final$long_1[final$iteration == i] <- df_1[i, 1]
final$lat_1[final$iteration == i] <- df_1[i, 2]
final$long_2[final$iteration == i] <- df_2[final$id[final$iteration == i], 1]
final$lat_2[final$iteration == i] <- df_2[final$id[final$iteration == i], 2]
}
有人可以告诉我,如果我这样做是正确的吗?
谢谢!
2条答案
按热度按时间cqoc49vn1#
我们可以使用
crossing
来扩展两个数据集,而不是执行多个循环,使用rowwise
属性应用distHaversine
如果我们使用嵌套的
for
循环,则可以在单个循环中完成wwwo4jvm2#
也许只是这样做:
输出: