r - 如何通过将列表元素列表作为函数参数来对列表应用函数?
问题描述
可重现的数据集-
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 循环。你们能帮忙吗?真的很感激。
解决方案
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
推荐阅读
- python-3.x - Docker Container - 当 Python 脚本运行时,Discord Bot 挂起
- sql - 如何找到平均时间?SQL 服务器 2017
- google-sheets - Google 表格中的条件数据验证
- aws-application-load-balancer - 基于 ALB 入口控制器路径的路由
- django - 在子目录上部署 Django App (Namecheap)
- javascript - NextJs youtube iframe cookie
- primefaces - 有没有办法在不使用 JavaScript 的情况下在 primefaces 水平条形图中显示点标签?
- angular - 为什么我会收到“没有重载匹配此调用”错误
- python - 即使在关闭 gui 后 Python 也保存变量
- python - 我想使用python的replace()函数删除文本中的字符,但只删除了一半