按日期排序数据框列表

时间:2017-06-13 13:51:46

标签: r date dplyr reorderlist

我有一个与此类似的结构中的数据框列表:

`ID1_01/05/10` <- data.frame(c(1,1))
`ID1_21/02/10` <- data.frame(c(2,1))
`ID2_01/05/10` <- data.frame(c(3,1))
`ID2_21/02/10` <- data.frame(c(4,1))
lst <- list(mget ( ls ( pattern = 'ID\\d+')))

我想首先按照身份然后按日期在列表中订购它们。即:

`ID1_21/02/10`
`ID1_01/05/10`
`ID2_21/02/10`
`ID2_01/05/10`

有没有办法轻松做到这一点?

1 个答案:

答案 0 :(得分:1)

我们提取names,获取数字部分('v1')和Date部分,以及基于它的order

nm1 <-  sapply(lst, names)[,1]
v1 <- as.numeric(sub(".*(\\d+)_.*", "\\1", nm1))
d1 <- as.Date(sub(".*_", "", nm1), "%d/%m/%y")
nm1[order(v1, d1)]
#[1] "ID1_21/02/10" "ID1_01/05/10" "ID2_21/02/10" "ID2_01/05/10"

lapply(lst, function(x) x[order(v1, d1)])
#[[1]]
#[[1]]$`ID1_21/02/10`
# c.2..1.
#1       2
#2       1

#[[1]]$`ID1_01/05/10`
#  c.1..1.
#1       1
#2       1

#[[1]]$`ID2_21/02/10`
#  c.4..1.
#1       4
#2       1

#[[1]]$`ID2_01/05/10`
#  c.3..1.
#1       3
#2       1

更新

在OP的示例中,mgetlist包裹,它将创建list lists。相反,它将是

lst <- mget ( ls ( pattern = 'ID\\d+'))

如果是这样,那么

nm1 <- names(lst)
lst[order(v1, d1)]