我创建了一个数据框,如下所示:
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_”开头的项目的行。
另一种使用方法dplyr
:
library(dplyr)
arrange(df, sub('_.+$', '', item), mean)
一种替代方法是使用str_extract
fromstringr
来仅提取第一个字母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] 删除。
我来说两句