使用tidyr top_n通过变量进行选择并包含NA

时间:2019-06-10 22:50:13

标签: r sorting dplyr

我正在尝试使用dplyr对变量进行分组,并确定数据集中每个位置的最近位置。我还想包括所有未测量距离(NA)的行。

# Set up df of place, distance, and destination.
df <- data.frame(place = c('A','B','B','C','C','D','D'),dist = c(NA, 4, 1, 6, 3, 1, 1), dest = 1:7)

# For each place, get the nearest destination. 
df %>% 
  group_by(place) %>%
  top_n(1, desc(dist))

# This does not return a row for place A. 

是否有一个tidyr解决方案,可用于使用top_n根据排名识别行,这些行还将包括尚未排名的行?预先谢谢你。

1 个答案:

答案 0 :(得分:0)

这可行,但是可能有更有效的解决方案。

coalesce(dist, max(dist), ...)在这里是因为我们优先考虑非null值。然后,我们要确保随机值不会以top_n结尾,因此我们采用了该组的max(dist)。最后,要实际返回值,我在其中放了一个数字-您可以使用任何数字。

如果您要进行非desc,则可能会使用min(dist)而不是max(dist)

df %>% 
  group_by(place) %>%
  top_n(1, desc(coalesce(dist, max(dist)+1, 0)))

  place  dist  dest
  <fct> <dbl> <int>
1 A        NA     1
2 B         1     3
3 C         3     5
4 D         1     6
5 D         1     7