如何在dplyr中基于group_by对列中的值进行排序

时间:2018-03-28 04:11:07

标签: r dplyr tidyverse

我有以下数据框:

library(tidyverse)
dat <- structure(list(motif = c("MA0002.2_RUNX1", "MA0002.2_RUNX1", 
"MA0002.2_RUNX1", "MA0002.2_RUNX1", "MA0029.1_Mecom", "MA0029.1_Mecom", 
"MA0029.1_Mecom", "MA0029.1_Mecom"), cell_type = c("Adipose", 
"Bonemarrow", "Pulmonary", "Vertebral", "Adipose", "Bonemarrow", 
"Pulmonary", "Vertebral"), score = c(-9.86201111303514, 35.057552338226, 
-29.6389757883848, 7.54179196588973, 11.1302803315903, -6.87498775985931, 
-0.949533749727933, -3.70277441518105)), class = c("tbl_df", 
"tbl", "data.frame"), .Names = c("motif", "cell_type", "score"
), row.names = c(NA, -8L))

dat
#> # A tibble: 8 x 3
#>   motif          cell_type    score
#>   <chr>          <chr>        <dbl>
#> 1 MA0002.2_RUNX1 Adipose    - 9.86 
#> 2 MA0002.2_RUNX1 Bonemarrow  35.1  
#> 3 MA0002.2_RUNX1 Pulmonary  -29.6  
#> 4 MA0002.2_RUNX1 Vertebral    7.54 
#> 5 MA0029.1_Mecom Adipose     11.1  
#> 6 MA0029.1_Mecom Bonemarrow - 6.87 
#> 7 MA0029.1_Mecom Pulmonary  - 0.950
#> 8 MA0029.1_Mecom Vertebral  - 3.70

我想要做的是group_by motif然后按照主题中的组内的值进行排序。

期望的最终结果是:

MA0002.2_RUNX1 Bonemarrow  35.1  
MA0002.2_RUNX1 Vertebral    7.54 
MA0002.2_RUNX1 Adipose    - 9.86 
MA0002.2_RUNX1 Pulmonary  -29.6  
MA0029.1_Mecom Adipose     11.1  
MA0029.1_Mecom Pulmonary  - 0.950
MA0029.1_Mecom Vertebral  - 3.70 
MA0029.1_Mecom Bonemarrow - 6.87 

我试过这个却失败了:dat %>% group_by(motif) %>% arrange(desc(score))

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这就是你要追求的吗?

dat %>% arrange(motif, desc(score));


#    # A tibble: 8 x 3
#  motif          cell_type    score
#  <chr>          <chr>        <dbl>
#1 MA0002.2_RUNX1 Bonemarrow  35.1
#2 MA0002.2_RUNX1 Vertebral    7.54
#3 MA0002.2_RUNX1 Adipose     -9.86
#4 MA0002.2_RUNX1 Pulmonary  -29.6
#5 MA0029.1_Mecom Adipose     11.1
#6 MA0029.1_Mecom Pulmonary   -0.950
#7 MA0029.1_Mecom Vertebral   -3.70
#8 MA0029.1_Mecom Bonemarrow  -6.87

如果您只想排序,则无需group_by

详细信息:在您的情况下,group_by(motif) 实际上是motif组条目,但它不会重新排列它们。要做到这一点,你仍然需要dat %>% group_by(motif) %>% arrange(motif, desc(score))。但由于您实际上并未在组级别应用任何转换,group_by是多余的。