我有一个数据集,它有一些大的组和子组(小组)。
我想为每个大组选择小组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
答案 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
或将match
与slice
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