如何通过将列表元素列表作为函数参数来在列表上应用函数?

How to apply function over a list by taking list of list elements as function argument?

可重现的数据集-

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" 作为因变量和 "timestamp" 作为预测变量和 return 所有斜率(在这种情况下 - 2)分别为每个标签拟合线性回归模型).

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

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

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