可能有一个更简单的方法来做到这一点,但我正在努力找到合适的语言来搜索解决方案,所以我决定只是发布它。
我实际上是在尝试创建一个新列,其中对于列a中的每个值,我们过滤其他两个列并应用计算。
我的数据是这样的:
user_loc fr_loc distance country_1990_user country_1990_fr ew_border_user ew_border_fr
<chr> <chr> <dbl> <chr> <chr> <dbl> <dbl>
1 DE11 DE12 77.2 DE DE 0 0
2 DE11 DE13 137. DE DE 0 0
3 DE11 DE14 88.2 DE DE 0 0
...
10 DE12 DED2 190. DE GC 0 0
11 DE12 DED4 249. DE GC 0 1
12 DE11 DE23 206. DE DE 0 0
user_loc和fr_loc分别是德国的NUTS2区域。Distance是它们的质心之间的距离,country_1990_user和country_1990_fr是它们在1990年是东德还是西德的一部分(DE是西德,GC是东德)。我已经为用户和用户计算了一个边界假人,它基本上只是描述了他们是否沿着东西边界。
我想做的是:对于user_loc中的每个唯一值,筛选country_1990不同的值(仅限GC和DE对),并筛选ew_border_fr==1,并计算最小距离。也就是说,对于每个user_loc,最接近的NUTS2区域位于另一个国家,并且与边界接触。
我已经试过了:
nuts2_dist_germ2 <- nuts2_dist_germ %>%
group_by(user_loc) %>%
filter(country_1990_user != country_1990_fr) %>%
filter(ew_border_fr == 1) %>%
mutate(min_border_dist = min(distance))
基本上得到了我想要的,但它最终删除了大约100个观察结果,我不明白为什么。我也尝试过以for循环的方式来做这件事(这不是我的强项),但这最终只给了我最小的总距离。这是我的代码:
for (i in 1:ncol(nuts2_dist_germ)) {
nuts2_dist_germ %>%
group_by(user_loc) %>%
filter(country_1990_user != country_1990_fr) %>%
filter(ew_border_fr == 1) %>%
mutate(min_border_dist = min(distance))
}
谁有更好的办法给我想要的东西?我想要一个重复的距离,它是每个user_loc的最小值。以前的代码确实给了我这个,但是正在删除观察值,我不明白为什么。
谢谢!
你的代码正在删除观察值,因为这就是dplyr::filter()
的工作。
if_else()
调用仅在感兴趣的条件下计算它,然后summarise()
:
dat |>
mutate(
distance2 = if_else(
country_1990_user != country_1990_fr & ew_border_fr == 1,
true = distance,
false = NA_real_
)) |>
group_by(user_loc) |>
summarise(min_distance = min(distance2, na.rm = TRUE))
输出user_loc min_distance
<chr> <dbl>
1 DE11 Inf
2 DE12 249