R - 取消列出嵌套的日期列表

时间:2018-05-07 20:59:57

标签: r date nested-lists

我有以下嵌套的日期列表。我需要取消列表,然后从最早的日期到最晚的日期获得唯一的日期列表。

> str(datetemp)
List of 3
 $ FCX : Date[1:5747], format: "1995-07-10" "1995-07-11" "1995-07-12" "1995-07-13" ...
 $ MAT : Date[1:9164], format: "1982-01-04" "1982-01-05" "1982-01-06" "1982-01-07" ...
 $ MSFT: Date[1:8104], format: "1986-03-13" "1986-03-14" "1986-03-17" "1986-03-18" ...

下面剥去日期类并返回数字列表。

datetemp <- sort(unique(unlist(datetemp)))

我用google搜索并读取unlist将剥离日期类并以数字形式返回,并且一些示例在日期列表中显示do.call。

我是R的新手,如果有人能告诉我如何将do.call应用于嵌套列表以获得所需的输出,我将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用do.call(c, ...)展平列表,同时保留日期类型。

ll <- lapply(7:9, function(x) as.Date(sample(7000:7020, x), origin="1970-01-01"))

unique(do.call(c, ll))

答案 1 :(得分:1)

一种选择是在unlist删除之后强制回到Date类。为此,您需要指定计算整数的origin,即the Unix epoch,即1970-01-01

datetemp <- list(FCX = structure(c(9321, 9322, 9323, 9324), class = "Date"), 
                 MAT = structure(c(4386, 4387, 4388, 4389), class = "Date"), 
                 MSFT = structure(c(5915, 5916, 5919, 5920), class = "Date"))

datetemp2 <- as.Date(unlist(datetemp), origin = "1970-01-01")
datetemp2
#>         FCX1         FCX2         FCX3         FCX4         MAT1 
#> "1995-07-10" "1995-07-11" "1995-07-12" "1995-07-13" "1982-01-04" 
#>         MAT2         MAT3         MAT4        MSFT1        MSFT2 
#> "1982-01-05" "1982-01-06" "1982-01-07" "1986-03-13" "1986-03-14" 
#>        MSFT3        MSFT4 
#> "1986-03-17" "1986-03-18"

更好的方法是使用do.call,它将列表作为调用的参数进行拼接并对其进行评估,因此如果您使用do.call(c, list(1, 2)),则会有效地调用c(1, 2)。< / p>

datetemp3 <- do.call(c, datetemp)
datetemp3
#>         FCX1         FCX2         FCX3         FCX4         MAT1 
#> "1995-07-10" "1995-07-11" "1995-07-12" "1995-07-13" "1982-01-04" 
#>         MAT2         MAT3         MAT4        MSFT1        MSFT2 
#> "1982-01-05" "1982-01-06" "1982-01-07" "1986-03-13" "1986-03-14" 
#>        MSFT3        MSFT4 
#> "1986-03-17" "1986-03-18"

对重复项进行排序和删除会丢弃名称,这可能很好:

unique(sort(datetemp3))
#>  [1] "1982-01-04" "1982-01-05" "1982-01-06" "1982-01-07" "1986-03-13"
#>  [6] "1986-03-14" "1986-03-17" "1986-03-18" "1995-07-10" "1995-07-11"
#> [11] "1995-07-12" "1995-07-13"