对于每个大组,选择R中可用的最佳子组

时间:2018-03-09 11:26:34

标签: r dplyr

我有一个数据集,它有一些大的组和子组(小组)。

我想为每个大组选择小组1。但是,如果小组1不存在于大组中,请选择子组2.我的示例在此停止,但理想情况下这将继续工作,因此如果未找到子组2,请选择子组3等。例如我使用数字,但我的重点是用因子水平做这个。

这可能与dplyr中的因素有关吗?假设因子水平按重要性排序?

以下是我的示例数据:

set.seed(123)
big_group = rep(1:3, each = 6)
small_group = c(sample(1:2, size = 6, replace = TRUE),
                rep(1, each = 6),
                rep(2, each = 6)) %>% 
  as.factor()

d = data.frame(big_group,
               small_group,
               value = runif(n = 3 * 6))

理想的输出是

big_group    small_group    values
1            1              0.52810549
2            1              0.67757064
3            2              0.32792072

3 个答案:

答案 0 :(得分:2)

不是dplyr解决方案,但在R中你可以这样做:

do.call(rbind, by(d, d$big_group, function(x) x[which.min(d$small_group),]))

#   big_group small_group     value
# 1         1           1 0.5281055
# 2         2           1 0.6775706
# 3         3           2 0.3279207

答案 1 :(得分:2)

我们将'big_group',filter分组为'small_group'的min值,然后slice第一行

d %>%
   group_by(big_group) %>%
   filter(as.numeric(small_group) == min(as.numeric(small_group))) %>% 
   slice(row_number()==1)
# A tibble: 3 x 3
# Groups: big_group [3]
#   big_group small_group value
#      <int> <fctr>      <dbl>
#1         1 1           0.528
#2         2 1           0.678
#3         3 2           0.328

或将matchslice

一起使用
d %>% 
  group_by(big_group) %>% 
  slice(match(levels(droplevels(small_group))[1], levels(droplevels(small_group))))

答案 2 :(得分:2)

结合@akrun和@KarolisKoncevičius的答案你也可以这样做:

d %>%
  group_by(big_group) %>% 
  slice(which.min(small_group))
#> # A tibble: 3 x 3
#> # Groups:   big_group [3]
#>   big_group small_group value
#>       <int> <fct>       <dbl>
#> 1         1 1           0.528
#> 2         2 1           0.678
#> 3         3 2           0.328