【问题标题】:Generalize ordering of a vector using a custom order with changing values使用具有变化值的自定义顺序来概括向量的顺序
【发布时间】:2023-03-21 12:09:01
【问题描述】:

我有一个要以特定方式订购的向量。这些向量基于列名。我有一个州名列表。我还有一个由“_sub”表示的每个状态的子集,以及由“_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”集应该在“var”之后和“NY”集之前。在集合中,我想先显示“AK_sub”,然后显示“AK_sub_pct”,然后显示“AK”,然后显示“AK_pct”。然后每个其他状态都应该遵循相同的模式。 “美国”应该是最后但相同的一般顺序。也没有“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")

【问题讨论】:

    标签: r sorting


    【解决方案1】:

    这里是tidyverse 中的一个选项。这个想法是单独进行排序(arrange),即我们用word提取_(州缩写,国家缩写,'var')之前的前缀部分,然后用levels创建一个factor按“var”、state.abb 和国家“US”的顺序指定,然后我们在提取的子字符串上添加第二个顺序,即。 'sub', 'pct', 'sub_pct' 和 match 按我们想要的顺序在同一个唯一子字符串上。最后,selectpull 原来的 '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       
    

    【讨论】:

    • @hmhensen 如果美国有所有州怎么办。那么,顺序会不一样吧?
    • @hmhensen 根据您的预期,状态不按字母顺序排列,即。 US 是如何在 UT 之后出现的?
    • @hmhensen 好的,知道了。没有发现美国和各州的区别:-)。用 state.abb 更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多