Reputation: 495
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
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
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