我尝试了不同的方法,寻找类似的问题,但没有好运气。
我想用一个自定义的规则来排列和区分我的df,在这个规则中,我只在每个val
最小的组中保留一行,但是当val
中有1时,我想保留1而不是最小的值。val
是值列,ID
是ID列:
x = data.frame(ID=c("a", "a",
"b", "b",
"c", "c",
"d", "d"),
val=c(1, 2,
0.5, 2,
1, 0.5,
5, 20))
x
看起来像:
ID val
1 a 1.0
2 a 2.0
3 b 0.5
4 b 2.0
5 c 1.0
6 c 0.5
7 d 5.0
8 d 20.0
我试过这样的方法:
x %>% group_by(ID) %>% arrange(val) %>% distinct(ID, .keep_all = T) %>% arrange(ID)
它给了我:
ID val
1 a 1
2 b 0.5
3 c 0.5
4 d 5
已尝试slice_min
:
x %>%
group_by(ID) %>%
slice_min(order_by = tibble(val != 1, val), n = 1, with_ties = FALSE) %>%
ungroup()
它给了我:
# A tibble: 3 × 2
ID val
<chr> <dbl>
1 a 1
2 c 1
3 d 5
Warning messages:
1: In xtfrm.data.frame(x) : cannot xtfrm data frames
2: In xtfrm.data.frame(x) : cannot xtfrm data frames
3: In xtfrm.data.frame(x) : cannot xtfrm data frames
4: In xtfrm.data.frame(x) : cannot xtfrm data frames
预期输出:
ID val
1 a 1
2 b 0.5
3 c 1
4 d 5
1条答案
按热度按时间jum4pzuy1#
您可以按
val != 1
和val
排列,并对分组数据使用slice_head()
。或者使用
dplyr
的开发版本,您可以使用slice_min()
并利用order_by
参数,该参数可以通过tibble()
接受多个变量: