使用r中的过滤器对列中的每个唯一值应用计算



可能有一个更简单的方法来做到这一点,但我正在努力找到合适的语言来搜索解决方案,所以我决定只是发布它。

我实际上是在尝试创建一个新列,其中对于列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

最新更新