2

我有一个这样的数据框和向量:

df1 <- data.frame(orig = c(1,1,1,2,2,2,2,3,3),
                  proxy = c(1,43,65,2,44,45,46,3,55),
                  dist = c(0, 100,101, 10, 1000, 5000, 5001,0,3))

v <- c(1,45:100)

我现在想要以下内容:

对于 中的每个唯一值df1$orig(为了简单起见,这里是一个数字,但也可以是字符),如果在orig中没有相同的值v,请找到具有最低 的最佳代理dist

在这个例子中,第一个值df1$orig是 1,这个值也是可用的v,所以我们采用它。中的第二个唯一值df$orig是 2,这在 中不可用v。在这种情况下,最低的最佳代理dist是 44,但两者都不v是。次优是 45,这个值是 inv所以我们接受它。中的第三个唯一值df1$orig是 3,并且 中没有 3 v。这里最好的代理是 55。

解是 c(1,45,55)

请注意,每个origin的第一个值proxyorig值。 dist在这里排序,但不一定总是如此。

4

2 回答 2

3

这可以通过 {dplyr} 的几个步骤完成:保留 中的代理v,排序dist并为每个代理选择第一个orig

library(dplyr)

df1 %>% 
  filter(proxy %in% v) %>% 
  arrange(dist) %>% 
  group_by(orig) %>% 
  slice(1)
#> # A tibble: 3 x 3
#> # Groups:   orig [3]
#>    orig proxy  dist
#>   <dbl> <dbl> <dbl>
#> 1     1     1     0
#> 2     2    45  5000
#> 3     3    55     3

reprex 包(v0.3.0)于 2019 年 9 月 11 日创建

于 2019-09-11T11:55:19.203 回答
1

如果您在dplyr解决方案旁边也对基本解决方案感兴趣。

拳头减少到那些在 and 之间匹配的proxyv然后order通过origanddist然后取那些不匹配的duplicated

tt <- df1[df1$proxy %in% v,]
tt <- tt[order(tt$orig, tt$dist),]
tt[!duplicated(tt$orig),]
#  orig proxy dist
#1    1     1    0
#6    2    45 5000
#9    3    55    3

或者,如果您orig在两者之间不匹配时丢失一些proxyv您可以使用:

tt <- df1[df1$proxy %in% v,]
tt <- tt[order(tt$orig, tt$dist),]
tt <- tt[!duplicated(tt$orig),c("orig", "proxy")]
tt$proxy[match(unique(df1$orig), tt$orig)]
#[1]  1 45 55
于 2019-09-11T12:28:53.350 回答