首页 > 解决方案 > 如何通过将列表元素列表作为函数参数来对列表应用函数?

问题描述

可重现的数据集-

set.seed(55)
data <- rnorm(8)

dates <- as.POSIXct("2019-03-18 10:30:00", tz = "CET") + 0:7*60
dataset <- xts(x = data, order.by = dates)

colnames(dataset) <- "R"
dataset$Timestep <- 1:8
dataset$Label <- 1
dataset$Label[4:8,] <- 2 

我试图通过将“R”作为因变量和“时间戳”作为预测变量来分别为每个标签拟合线性回归模型并返回所有斜率(在这种情况下为 2)。

最初我的想法是使用 split 和 lapply 功能,但无法执行它,因为我不知道如何使用 lapply 访问列表列表。

由于数据集非常大,我想避免 for 循环。你们能帮忙吗?真的很感激。

标签: rsplittime-serieslapplyxts

解决方案


1)公式使用显示的公式嵌套在Label

co <- coef(lm(R ~ factor(Label) / (Timestep + 1) + 0, dataset))
co[grep("Timestep", names(co))]
## factor(Label)1:Timestep factor(Label)2:Timestep 
##              0.01572195              0.15327212 

2) split/lapply 如图所示交替使用 split/lapply:

slope <- function(x) coef(lm(R ~ Timestep, x))[2]
sapply(split(dataset, dataset$Label), slope)
## 1.Timestep 2.Timestep 
## 0.01572195 0.15327212 

2a)或者,我们可以使用相同的最后一行代码,但将slope函数替换为直接计算斜率的计算,而无需lm

slope <- function(x) with(x, cov(R, Timestep)  / var(Timestep))
sapply(split(dataset, dataset$Label), slope)  # same as sapply line in (2)
##          1          2 
## 0.01572195 0.15327212 

3) nlme 这个包是 R 自带的,所以不需要安装。

library(nlme)
coef(lmList(R ~ Timestep | Label, dataset))[, "Timestep"]
## [1] 0.01572195 0.15327212

推荐阅读