按R中的首字母和数字对多列进行排序

梅尔贝兹

我创建了一个数据框,如下所示:

item  mean
a_b   5
a_c   2
a_a   4
b_d   7
b_f   3
b_e   1

我想对它进行排序,以便首先按它是否以“ a_”或“ b_”开头进行排序,然后再按均值对其进行排序。最终数据帧应如下所示:

item  mean
a_c   2
a_a   4
a_b   5
b_e   1
b_f   3
b_d   7

请注意,项目列并非按字母顺序完美排序。它仅按首字母排序。

我努力了:

arrange(df, item, mean) 

这样做的问题在于,它不仅按“ a_”和“ b_”类别进行排序,而且还按整个项目名称进行排序。

我愿意使用过滤器将原始数据帧分离为单独的数据帧,然后在这些较小的子集中对均值进行排序。我不需要所有内容都保留在同一数据框中。但是,我不确定如何使用过滤器仅选择具有以“ a_”或“ b_”开头的项目的行。

avid_useR

另一种使用方法dplyr

library(dplyr)
arrange(df, sub('_.+$', '', item), mean)

一种替代方法是使用str_extractfromstringr来仅提取第一个字母item

library(stringr)
arrange(df, str_extract(item, '^._'), mean)

结果:

  item mean
1  a_c    2
2  a_a    4
3  a_b    5
4  b_e    1
5  b_f    3
6  b_d    7

数据:

df <- structure(list(item = c("a_b", "a_c", "a_a", "b_d", "b_f", "b_e"
), mean = c(5L, 2L, 4L, 7L, 3L, 1L)), .Names = c("item", "mean"
), class = "data.frame", row.names = c(NA, -6L))

笔记:

  • sub('_.+$', '', item)通过从中删除 _和之后的所有内容来创建一个临时变量item_.+$匹配文字下划线(_),然后.+在字符串($的末尾与任意字符多次()匹配

  • str_extract(item, '^._')通过提取任意一个字符(.),然后_在字符串(^的开头加上文字下划线(),创建一个临时变量

  • 整洁的dplyr::arrange是,您可以在函数内创建一个临时排序变量,而不必将其包含在输出中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章