如何通过名称访问存储在R data.table对象中的列表项

时间:2019-09-18 16:27:16

标签: r list data.table

我想使用data.table功能运行每月回归并返回系数,残差等。

在下面的示例代码中,我希望能够看到每个命名列表。我的第一个reg.list调用做到了这一点,但它要求我为要返回的每个列表调用fit.lm帮助器函数。这可能没有效率。我的第二个reg.list调用仅调用一次,但是我将所有变量串在一起而不是放在命名列表中。也许我没有采用正确的方法。


f1 <- data.table(datadate = '1/1/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f2 <- data.table(datadate = '1/2/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f3 <- data.table(datadate = '1/3/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
fdata <- rbind(f1,f2,f3)

fit.lm <- function(mdate) {

  cols <- c("datadate", "id", 'y', 'x')
  load <- fdata[datadate == mdate, ..cols]
  mod <- lm(formula = 'y ~ x', data = load)
  return(list(coef = list(mod$coefficients), residuals = list(mod$residuals), r2 = list(summary(mod)$r.squared)))
}

reg.list <- fdata[, list( coef = fit.lm(datadate)$coef,
                          residuals = fit.lm(datadate)$residuals,
                          r2 = fit.lm(datadate)$r2), by = datadate]


reg.list <- fdata[, list(mod = fit.lm(datadate)), by = datadate]
reg.list[[2]]

在第二次调用reg.list的过程中,我将必须按以下方式访问输出:

reg.list[[2]][1]
reg.list[[2]][2]
reg.list[[2]][3]
reg.list[[2]][4]
reg.list[[2]][5]
reg.list[[2]][6]
reg.list[[2]][7]
reg.list[[2]][8]
reg.list[[2]][9]

这似乎不是一种非常用户友好的方式。我想我做错了。我想做类似的事情:

reg.list[2][['coef']]
reg.list[2][['residuals']]
reg.list[2][['r2']]

2 个答案:

答案 0 :(得分:0)

基于@IceCreamToucan所说的内容,我认为这里的主要问题是fit.lm函数推出了不同长度的列表,因此data.table无法使结果平坦。如果使函数为返回列表的每个项目推出相同数量的值,则data.table可以使结果变平并使数据保持整洁。参见下面的代码->

f1 <- data.table(datadate = '1/1/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f2 <- data.table(datadate = '1/2/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f3 <- data.table(datadate = '1/3/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
fdata <- rbind(f1,f2,f3)

fit.lm <- function(mdate) {

  cols <- c("datadate", "id", 'y', 'x')
  load <- fdata[datadate == mdate, ..cols]
  mod <- lm(formula = 'y ~ x', data = load)

  return(c(as.list(mod$coefficients),
           'sse' = sqrt(mean(mod$residuals^2)), 
           'r2' = summary(mod)$r.squared
           )
         )
}



fdata[,fit.lm(datadate), by = datadate]

答案 1 :(得分:0)

感谢@IceCreamToucan和@Bryan提供有用的信息。利用我从你们俩那里学到的东西,我能够构建自己想要的东西(请参见下面的代码)。我想返回3个列表(或对象),以便coef将是回归包含的所有coef的列表,而残差将是包含许多残差的列表。


fit.lm <- function(mdate) {

  cols <- c("datadate", "id", 'y', 'x')
  load <- fdata[datadate == mdate, ..cols]
  mod <- lm(formula = 'y ~ x', data = load)

  return(list('coef' = list(mod$coefficients),
    'resid' = list(mod$residuals), 
    'r2' = summary(mod)$r.squared))

}
reg.list <- fdata[, fit.lm(datadate), by = datadate]


这使我可以轻松地看到自己的系数...


coefs <- do.call("rbind", reg.list$coef)