Извлечение значений из списка и добавление в (панель) данных - PullRequest
0 голосов
/ 11 сентября 2018

В то время как я нашел несколько ответов о том, как преобразовать списки в кадры данных, я борюсь с тем, как извлечь конкретное значение списка и добавить его в кадр данных панели так, чтобы значения списка соответствовали структуре панели (страна, год).

Я думаю, что это проще объяснить с помощью воспроизводимого примера:

# 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?

Я действительно ценю любую помощь или подсказку в этой проблеме!

1 Ответ

0 голосов
/ 11 сентября 2018

Хорошо, наконец-то я нашел решение, оно может быть не таким гибким и элегантным, но оно делает то, что мне по сути нужно.Сначала добавьте $trend непосредственно к функции hpfilter, например:

hpf <- dlply(df1, .(country), 
         function(x) hpfilter(x$X1, type = "lambda", freq = 6.25)$trend)

Поскольку результат hpf находится в списке списка, я использую unlist:

# unlist hpf
unlhpf <- unlist(hpf, recursive = FALSE)

# convert into data frame
unlhpfdf <- data.frame(unlhpf)

# Add to dataframe
df1$X1_trend <- unlhpfdf$unlhpf

Пожалуйста, не стесняйтесь улучшать этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...