我有一个向量,我正试图以特定的方式排序。这些矢量基于列名。我有一份州名清单。对于每个状态,我也有一个子集_sub";以及对这些列中的每一列的计算,用"0"表示_pct";。此外,还有一个叫做";var";以及元件";US";以及";US_pct";在国家层面。
这是一个可复制的数据集:
vec <- c("var", "NY", "AK", "UT", "US", "NY_sub", "UT_sub", "AK_sub", "AK_pct", "AK_sub_pct", "NY_sub_pct", "UT_sub_pct", "UT_pct", "NY_pct", "US_pct")
我希望各州按字母顺序排列。但他们也应该遵循国家集团内部的另一种秩序。例如;AK";set应该在";var";并且在";NY";设置在布景中,我想展示";"AK_ sub";首先;sub_pct";,那么";AK";,那么";AK_pct";。然后其他所有状态都应该遵循相同的模式。";US";应该是最后但相同的一般顺序。也没有";US_sub";。
在运行代码之前,我也不知道向量中会包括哪些状态,所以我不能使用match
准确地指定顺序。一般情况下必须这样做。
按字母顺序排列的部分很简单:sort(var)
,但我不确定如何完成其余部分
这是我想要的结果。欢迎使用dplyr
解决方案。
c("var", "AK_sub", "AK_sub_pct", "AK", "AK_pct", "NY_sub", "NY_sub_pct", "NY", "NY_pct", "UT_sub", "UT_sub_pct", "UT", "UT_pct", "US", "US_pct")
这里是tidyverse
中的一个选项。其想法是单独进行排序(arrange
),即我们用word
提取_
(州缩写、国家缩写、'var')之前的前缀部分,然后用按'var'、state.abb
和国家'US'顺序指定的levels
创建factor
,然后我们在提取的子串上添加第二个顺序,即'sub'、'pct',"sub_pct"与match
按照我们想要的顺序在同一个唯一子字符串上。最后,select
或pull
是原始的"vec">
library(dplyr)
library(stringr)
library(tibble)
out <- tibble(vec) %>%
mutate(new = word(vec, 1, sep="_")) %>%
arrange(factor(new, levels = c('var', state.abb, "US")),
match(str_extract(vec, "sub|pct|sub_pct"),
c("sub", "sub_pct", NA, "pct"))) %>%
select(vec)
-输出
> out
# A tibble: 15 x 1
vec
<chr>
1 var
2 AK_sub
3 AK_sub_pct
4 AK
5 AK_pct
6 NY_sub
7 NY_sub_pct
8 NY
9 NY_pct
10 UT_sub
11 UT_sub_pct
12 UT
13 UT_pct
14 US
15 US_pct