В то время как я нашел несколько ответов о том, как преобразовать списки в кадры данных, я борюсь с тем, как извлечь конкретное значение списка и добавить его в кадр данных панели так, чтобы значения списка соответствовали структуре панели (страна, год).
Я думаю, что это проще объяснить с помощью воспроизводимого примера:
# A random (panel) dataframe
df1 <- read.table(text="country year X1
A 1990 10
A 1991 12
A 1992 14
A 1993 17
B 1990 20
B 1991 18
B 1992 12
B 1993 14", header=TRUE, stringsAsFactors=FALSE)
Затем я применяю hpfilter к X1
следующим образом:
library(mFilter)
hpf <- dlply(df1, .(country),
function(x) hpfilter(x$X1, type = "lambda", freq = 6.25))
Для тех, у кого mFilter
ниже dput от hpf
:
dput(hpf)
structure(list(A = structure(list(cycle = c(0.182268883056285,
-0.0838436862058909, -0.379119276757072, 0.280694079906678),
trend = structure(c(9.81773111694372, 12.0838436862059, 14.3791192767571,
16.7193059200933), .Dim = c(4L, 1L)), fmatrix = structure(c (0.280694079906678,
-0.379119276757072, -0.0838436862058909, 0.182268883056285,
-0.379119276757072, 0.674394867308253, -0.21143190434529,
-0.0838436862058909, -0.0838436862058909, -0.21143190434529,
0.674394867308253, -0.379119276757072, 0.182268883056285,
-0.0838436862058909, -0.379119276757072, 0.280694079906678
), .Dim = c(4L, 4L)), title = "Hodrick-Prescott Filter",
xname = "x$X1", call = hpfilter(x = x$X1, freq = 6.25, type = "lambda"),
type = "lambda", lambda = 6.25, method = "hpfilter", x = structure(c(10L,
12L, 14L, 17L), .Dim = c(4L, 1L))), .Names = c("cycle", "trend",
"fmatrix", "title", "xname", "call", "type", "lambda", "method",
"x"), class = "mFilter"), B = structure(list(cycle = c(0.335374744823564,
0.845727617381161, -2.69757946923301, 1.51647710702829), trend = structure(c (19.6646252551764,
17.1542723826188, 14.697579469233, 12.4835228929717), .Dim = c(4L,
1L)), fmatrix = structure(c(0.280694079906678, -0.379119276757072,
-0.0838436862058909, 0.182268883056285, -0.379119276757072, 0.674394867308253,
-0.21143190434529, -0.0838436862058909, -0.0838436862058909,
-0.21143190434529, 0.674394867308253, -0.379119276757072, 0.182268883056285,
-0.0838436862058909, -0.379119276757072, 0.280694079906678), .Dim = c(4L,
4L)), title = "Hodrick-Prescott Filter", xname = "x$X1", call = hpfilter(x = x$X1,
freq = 6.25, type = "lambda"), type = "lambda", lambda = 6.25,
method = "hpfilter", x = structure(c(20L, 18L, 12L, 14L), .Dim = c(4L,
1L))), .Names = c("cycle", "trend", "fmatrix", "title", "xname",
"call", "type", "lambda", "method", "x"), class = "mFilter")), split_type = "data.frame", split_labels = structure(list(
country = c("A", "B")), .Names = "country", class = "data.frame", row.names = c(NA,
-2L)), .Names = c("A", "B"))
Теперь результаты hpfilter хранятся в hpf
как список 2 (страна Aи страна B) где каждый имеет длину 10. Моя цель состоит в том, чтобы извлечь только trend
из списка для каждой страны и добавить его к кадру данных в новом столбце с именем X1_trend
.Легко извлечь trend
для каждой отдельной страны, например для страны A
, это становится:
hpf$A$trend
Однако, учитывая, что у меня большой набор данных со многими странами, я надеюсь, что естьболее простой и эффективный способ извлечения, а затем добавление trend
для всех стран к кадру данных df1
.Может быть, сразу за один шаг при применении функции hpfilter?
Я действительно ценю любую помощь или подсказку в этой проблеме!