微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决创建列表时排序数据集并维护顺序

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

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

数据(对此结构的道歉将使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)
         

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?