【问题标题】:Ordering dataset and maintain order when creating list创建列表时对数据集进行排序并保持顺序
【发布时间】:2020-12-20 00:33:16
【问题描述】:

我试图在创建列表时保持数据集的特定顺序。

我想做的事情:按列对数据集进行排序,并在创建列表时保持此顺序。应该很简单,但我发现的所有解决方案都无法正常工作。

数据(对于这个结构的道歉将在 reprex 上熟练)

    data <- structure(list(Fac_Map = structure(c(1L, 1L, 1L, 1L, 3L, 3L, 
4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 
8L, 8L, 9L, 9L, 9L, 9L, 4L, 4L, 4L, 4L, 10L, 10L, 10L, 10L, 2L, 
2L, 2L, 2L), .Label = c("Fac_1", "Fac_10", "Fac_2", "Fac_3_ProblemOrder", 
"Fac_4", "Fac_5", "Fac_6", "Fac_7", "Fac_8_ProblemOrder", "Fac_9"
), class = "factor"), Calendar = structure(c(2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L), .Label = c("Non-std", "Std"), class = "factor"), 
    S_Residency = structure(c(1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 
    1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 
    2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
    2L, 2L), .Label = c("Int", "Loc"), class = "factor"), Period = structure(c(1L, 
    2L, 1L, 2L, 3L, 3L, 3L, 3L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("2020 P1", 
    "2020 P2", "2020 S1"), class = "factor"), Sum_A = c(92.2, 
    91.7, 90.2, 88.6, 96.4, 91.4, 96.4, 91.4, 87.3, 95.3, 82.5, 
    89.1, 89, 90.1, 87.4, 88.9, 85.1, 89.6, 89.7, 88.1, 87.1, 
    91.1, 88.2, 87.9, 90.8, 97.9, 91, 88.8, 86.4, 89.5, 86.3, 
    86.4, 86.7, 90.8, 84.6, 86.8, 82.1, 86.8, 78.4, 80.7), Sum_S = c(75.9, 
    75.6, 75, 73.5, 78.6, 70.5, 78.6, 70.5, 69, 86, 65.9, 72.6, 
    69, 69.3, 71.5, 73.8, 65.4, 70.6, 70.6, 70.3, 68, 73, 68.4, 
    69.1, 69.7, 80.9, 70.7, 68, 66.3, 69.9, 67.6, 68, 65.5, 68.6, 
    63, 64.6, 60.4, 68.6, 59.1, 63.5), Order = c(1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 
    4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 
    8L, 8L, 8L, 9L, 9L, 9L, 9L)), class = "data.frame", row.names = c(NA, 
-40L))

部分工作尝试的代码:

#Reorder attempts
#1
arrange(data$Fac_Map, data,data$Order)
#2
data$Order <- as.numeric(as.character(data$Order))
data[order(data$Fac_Map,data$Order),]
#3
reorder(data$Fac_Map, data$Order)


#Create list
#List is not in order
Fac <- split(data, list(data$Fac_Map, data$Calendar))
Fac

当我创建列表时,顺序将无法正确粘贴。有什么想法吗?

【问题讨论】:

    标签: r list reorderlist


    【解决方案1】:

    我们可以将列更改为factor,并在arrange 步骤之后将levels 指定为unique 值。然后,我们执行splitgroup_split。注意到“Fac_Map”有字符串和数字。因此,通过matching 与'Fac_Map' 的mixedsorted levels 一起执行arrange 可能很有用

    library(dplyr)
    outlst <- data %>% 
        arrange(match(Fac_Map, gtools::mixedsort(levels(Fac_Map))), Order) %>%
        mutate(across(c(Fac_Map, Order, Calendar),
             ~ factor(., levels = unique(.)))) %>% 
        group_split(Fac_Map, Calendar)
    

    list中'Fac_Map'的值是按顺序排列的

    library(purrr)
    map_chr(outlst, ~ .x %>% 
                select(Fac_Map) %>% 
                slice(1) %>% 
                pull %>% 
                as.character())
    #[1] "Fac_1"              "Fac_2"              "Fac_3_ProblemOrder" "Fac_3_ProblemOrder" "Fac_4"             
    #[6] "Fac_5"              "Fac_6"              "Fac_7"              "Fac_8_ProblemOrder" "Fac_9"             
    #[11] "Fac_10"            
    

    或者在order之后通过'Order'使用base R,然后将要拆分的列转换为factorlevels作为unique

    data <- data[order(data$Order),]
    data[c("Fac_Map", "Calendar")] <- lapply(data[c("Fac_Map", "Calendar")],
         function(x) factor(x, levels = unique(x)))
    split(data, data[c("Fac_Map", "Calendar")], drop = TRUE)
             
    

    【讨论】:

    • 谢谢 Akrun 这太好了,在我需要 Fac_Map 和 Calendar 的列表中,我对 dyplr 包不是很热(在我的长长的升级列表中!),有没有办法用两者来创建列表,还是有非 dyplr 的方法?
    • @Keelin 它确实包含所有列。我只是提取 Fac_Map 的唯一值来显示顺序
    • @Keelin 我使用基本 R 选项(使用混合排序)进行了更新。希望有帮助
    • 非常感谢@akrun,基本 r 代码是按顺序排序的吗?我需要按顺序对 Fac_Map 进行排序,并使其粘在 Fac_Map 和日历的列表中。我试图修改基本的 r 代码,但我无法到达那里
    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多