我有以下嵌套的日期列表。我需要取消列表,然后从最早的日期到最晚的日期获得唯一的日期列表。
> 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应用于嵌套列表以获得所需的输出,我将不胜感激。
谢谢。
答案 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"