【问题标题】:How to access list items stored in an R data.table object by name如何按名称访问存储在 R data.table 对象中的列表项
【发布时间】:2020-01-19 16:04:33
【问题描述】:

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

在下面的示例代码中,我希望能够看到每个命名列表。我的第一个 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']]

【问题讨论】:

  • 您可以删除list 部分,因为它已经是一个列表,并写fdata[, fit.lm(datadate), by = datadate]。然后你有coef等作为列名,并且可以按通常的方式访问它们。

标签: r list data.table


【解决方案1】:

基于@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]

【讨论】:

    【解决方案2】:

    感谢@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)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多