首页 > 解决方案 > 从列表中提取值并添加到(面板)数据框

问题描述

虽然我找到了几个关于如何将列表转换为数据框的答案,但我正在努力解决如何提取列表的特定值并将其添加到面板数据框,以便列表的值尊重面板结构(国家、年份) .

我认为用一个可重现的例子更容易解释这一点:

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

X1然后我通过以下方式应用 hpfilter :

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 功能时直接一步?

我真的很感谢任何形式的帮助或提示这个问题!

标签: r

解决方案


好的,最后我找到了一个解决方案,它可能不是那么灵活和优雅,但它确实满足了我的本质需求。首先$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

请随时改进此答案。


推荐阅读