首页 > 解决方案 > 将数据帧列表转换为时间序列列表

问题描述

该包IMFdata返回一个数据框列表。

例如:

library(IMFData)

databaseID <- "IFS"
startdate = "2019-01-01"
enddate = "2019-03-01"
checkquery = FALSE

queryfilter <- list(CL_FREQ = "M", CL_AREA_IFS = c("AU", "BR"), CL_INDICATOR_IFS = "FIDR_PA")
IFS_ex <- CompactDataMethod(databaseID, queryfilter, startdate, enddate, checkquery)

此代码创建数据框列表IFS_ex

structure(list(`@FREQ` = c("M", "M"), `@REF_AREA` = c("AU", "BR"
), `@INDICATOR` = c("FIDR_PA", "FIDR_PA"), `@UNIT_MULT` = c("0", 
"0"), `@TIME_FORMAT` = c("P1M", "P1M"), Obs = list(structure(list(
    `@TIME_PERIOD` = c("2019-01", "2019-02", "2019-03"), `@OBS_VALUE` = c("1.95", 
    "1.95", "1.9")), class = "data.frame", row.names = c(NA, 
3L)), structure(list(`@TIME_PERIOD` = c("2019-01", "2019-02", 
"2019-03"), `@OBS_VALUE` = c("6.41275285614977", "5.70499999999921", 
"6.18810104544945")), class = "data.frame", row.names = c(NA, 
3L)))), row.names = 1:2, class = "data.frame")

我想将此数据帧列表转换为时间序列列表(list_ts)。这是预期的输出:

list_ts <- list(AU = structure(c(1.95, 1.95, 1.90), .Tsp = c(2019, 2019.16666666667, 12), class = "ts"), BR = structure(c(6.41275285614977, 
5.70499999999921, 6.18810104544945), .Tsp = c(2019, 2019.16666666667, 
12), class = "ts"))

标签: rlisttime-series

解决方案


尝试使用tidy = TRUE. 然后,您可以拆分数据框并应用于新列表。可以使用您显示的原始格式,但这需要更多的工作。

library(IMFData)
library(zoo)

databaseID <- "IFS"
startdate = "2019-01-01"
enddate = "2019-03-01"
checkquery = FALSE

IFS_ex <- CompactDataMethod(databaseID, queryfilter, startdate, enddate, checkquery,
                            tidy = TRUE)

lst_df <- split(IFS_ex, IFS_ex$`@REF_AREA`)

list_ts <- lapply(lst_df, function(x) ts(zoo(x$`@OBS_VALUE`, x$`@TIME_PERIOD`), start = c(2019, 1), frequency = 12))

# and to get rid of an attribute you do not want
list_ts <- lapply(list_ts, function(x) {attr(x, "index") <- NULL; x})

list_ts 
# $AU
#       Jan  Feb  Mar
# 2014 1.95 1.95 1.9 
# 
# $BR
#                   Jan              Feb              Mar
# 2014 6.41275285614977 5.70499999999921 6.18810104544945

推荐阅读