R语言 将某些行移到顶部或按自定义规则排列

lx0bsm1f  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(380)

我尝试了不同的方法,寻找类似的问题,但没有好运气。
我想用一个自定义的规则来排列和区分我的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
jum4pzuy

jum4pzuy1#

您可以按val != 1val排列,并对分组数据使用slice_head()

x %>%
  group_by(ID) %>%
  arrange(val != 1, val) %>%
  slice_head(n = 1) %>%
  ungroup()

# A tibble: 4 × 2
  ID      val
  <chr> <dbl>
1 a       1  
2 b       0.5
3 c       1  
4 d       5

或者使用dplyr的开发版本,您可以使用slice_min()并利用order_by参数,该参数可以通过tibble()接受多个变量:

x %>%
  group_by(ID) %>%
  slice_min(order_by = tibble(val != 1, val), n = 1, with_ties = FALSE) %>%
  ungroup()

相关问题