Priit Mets
Priit Mets

Reputation: 495

How sort values inside the list()?

I have a list

list(`groupA_2024-02-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2024-02-01` = structure(list(name = "groupB"), class = "colDef"), 
     `groupA_2022-04-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2022-04-01` = structure(list(name = "groupB"), class = "colDef"), 
     `groupA_2021-09-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2021-09-01` = structure(list(name = "groupB"), class = "colDef"), 
     `groupA_2024-04-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2024-04-01` = structure(list(name = "groupB"), class = "colDef"), 
     `groupA_2023-02-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2023-02-01` = structure(list(name = "groupB"), class = "colDef"))

Names have two part 1)before _ and 2) after _ . Before shows to which group (A or B) it corresponds to and second part shows the date. I want to sort this list in the following way 1)Group,2)Date. The necessary output is following:

list(`groupA_2021-09-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2021-09-01` = structure(list(name = "groupB"), class = "colDef"),
     `groupA_2022-04-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2022-04-01` = structure(list(name = "groupB"), class = "colDef"), 
     `groupA_2023-02-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2023-02-01` = structure(list(name = "groupB"), class = "colDef"),
     `groupA_2024-02-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2024-02-01` = structure(list(name = "groupB"), class = "colDef"), 
     `groupA_2024-04-01` = structure(list(name = "groupA"), class = "colDef"), 
     `groupB_2024-04-01` = structure(list(name = "groupB"), class = "colDef") 
)

I tried it with simply order function, however, here should be something complicated.

Upvotes: 0

Views: 47

Answers (2)

akrun
akrun

Reputation: 887951

We may use trimws from base R

lst1 <- lst1[order(trimws(names(lst1), whitespace = ".*_"))]

checking the order

> names(lst1)
 [1] "groupA_2021-09-01" "groupB_2021-09-01" "groupA_2022-04-01" 
 [4] "groupB_2022-04-01" "groupA_2023-02-01" "groupB_2023-02-01"
 [7] "groupA_2024-02-01" "groupB_2024-02-01" "groupA_2024-04-01" 
 [10] "groupB_2024-04-01"

Upvotes: 0

Ronak Shah
Ronak Shah

Reputation: 389325

Extract the names from the list, keep only the date part, change to Date class, order the dates and rearrange the list accordingly.

data <- data[order(as.Date(sub('.*_', '', names(data))))]
names(data)

# [1] "groupA_2021-09-01" "groupB_2021-09-01" "groupA_2022-04-01"
# [4] "groupB_2022-04-01" "groupA_2023-02-01" "groupB_2023-02-01"
# [7] "groupA_2024-02-01" "groupB_2024-02-01" "groupA_2024-04-01"
#[10] "groupB_2024-04-01"

Upvotes: 1

Related Questions