创建列表时排序数据集并维护顺序

问题描述

创建列表时,我试图维护数据集的特定顺序。

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

数据(对此结构的道歉将使reprex更加熟练)

    data <- structure(list(Fac_Map = structure(c(1L,1L,3L,4L,5L,6L,7L,8L,9L,10L,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,.Label = c("Non-std","Std"),S_Residency = structure(c(1L,.Label = c("Int","Loc"),Period = structure(c(1L,.Label = c("2020 P1","2020 P2","2020 S1"),Sum_A = c(92.2,91.7,90.2,88.6,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.7,84.6,86.8,82.1,78.4,80.7),Sum_S = c(75.9,75.6,75,73.5,78.6,70.5,69,86,65.9,72.6,69.3,71.5,73.8,65.4,70.6,70.3,68,73,68.4,69.1,69.7,80.9,70.7,66.3,69.9,67.6,65.5,68.6,63,64.6,60.4,59.1,63.5),Order = c(1L,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

创建列表时,订单将无法正确粘贴。有什么想法吗?

解决方法

factor步骤之后,我们可以将列levels更改为unique作为arrange值。然后,我们执行splitgroup_split。注意,“ Fac_Map”具有字符串和数字。因此,通过{Fac_Map'的arrange ed match mixedsort来完成levels

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}进行base R后使用order,然后将列转换为factor作为levels值的拆分成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",drop = TRUE)
         

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...