R:使用模式匹配从模型摘要列表中提取值
R: Extracting values from list of model summaries using pattern matching
我有一个模型摘要列表(假设它是一个线性模型;但这可以适用于任何模型摘要)。
目前,我正在使用以下方法从此摘要列表中提取某个系数:
coef <- sapply(modelsummaries, function(x) x[[4]][[4,1]])
如何通过调用变量名而不是依赖行位置来做到这一点?
对于列表中的每个模型摘要,只有一个变量不同,命名为V_01、V_02、V_03等。这是我想要的变量系数喜欢提取。
我正在考虑使用 grep 函数,例如:
coef <- sapply(modelsummaries, function(x) x[[4]][[grep("^[V]"),1]])
...但还没有成功。有什么建议吗?
这是一个可重现的例子(只需要调整最后一行):
newdata <- as.data.frame(seq(from = 0.1, to = 0.9, by = 0.1))
newdata <- as.data.frame(t(newdata))
colnames(newdata) = newdata[1, ]
colnames(newdata) <- paste("V", colnames(newdata), sep = "_")
mtcars <- mtcars
mtcarsmodel <- data.frame(mtcars, newdata)
mtcarsmodel[c(12:20)] <- sample(1:100, 288, replace=TRUE)
xnam <- paste(colnames(mtcarsmodel)[c(4:5)], sep="")
xnam2 <- paste(colnames(mtcarsmodel)[c(12:20)], sep="")
fmla <- paste(xnam, collapse= "+")
fmla2 <- paste(paste(fmla), "+")
fla <- paste("mpg ~", paste(fmla2))
models <- lapply(setNames(xnam2, xnam2), function(var) {
form = paste(fla, var)
lm(form, data=mtcarsmodel)
})
modelsummaries <-lapply(models, summary)
coef <- sapply(modelsummaries, function(x) x[[4]][[4,1]])
在与 grep 解决方案斗争之后,我犯了亵渎罪并改用 sql 解决方案:
library('sqldf')
new <- lapply(modelsummaries, function(x) setDT(data.frame(x[[4]]), keep.rownames = TRUE)[])
values <- sapply(new, function(x) sqldf("SELECT x.estimate, x.'Pr...t..' FROM x WHERE rn like '%V_%'"))
data <- as.data.frame(t(rbind(values)))
我还想出了一个(有点难看的)基于 grep 的解决方案:
coef <- sapply(modelsummaries, function(x) as.numeric(unlist(strsplit(grep("^V_", capture.output(x), value = TRUE), "\s+"))[[2]]))
你已经很接近了,你只需要告诉 grep
要搜索的内容,这是 coef()
返回的系数矩阵的行名(这是一种比获取它们更好的方法[[4]]
)。另外,为了不重复使用该名称,我建议将结果保存为不同的名称,例如 coefs
.
coefs <- sapply(modelsummaries, function(x) {
coef(x)[grep("^V", rownames(coef(x))),"Estimate"]
})
V_0.1 V_0.2 V_0.3 V_0.4 V_0.5 V_0.6 V_0.7 V_0.8
0.030927774 -0.053437459 0.009335911 -0.011009187 -0.010303494 -0.001705420 -0.036297492 0.021838044
V_0.9
0.005457086
此外,请查看新的 broom
包,它可以更轻松地以整洁的方式从模型中提取某些信息。
我有一个模型摘要列表(假设它是一个线性模型;但这可以适用于任何模型摘要)。
目前,我正在使用以下方法从此摘要列表中提取某个系数:
coef <- sapply(modelsummaries, function(x) x[[4]][[4,1]])
如何通过调用变量名而不是依赖行位置来做到这一点?
对于列表中的每个模型摘要,只有一个变量不同,命名为V_01、V_02、V_03等。这是我想要的变量系数喜欢提取。
我正在考虑使用 grep 函数,例如:
coef <- sapply(modelsummaries, function(x) x[[4]][[grep("^[V]"),1]])
...但还没有成功。有什么建议吗?
这是一个可重现的例子(只需要调整最后一行):
newdata <- as.data.frame(seq(from = 0.1, to = 0.9, by = 0.1))
newdata <- as.data.frame(t(newdata))
colnames(newdata) = newdata[1, ]
colnames(newdata) <- paste("V", colnames(newdata), sep = "_")
mtcars <- mtcars
mtcarsmodel <- data.frame(mtcars, newdata)
mtcarsmodel[c(12:20)] <- sample(1:100, 288, replace=TRUE)
xnam <- paste(colnames(mtcarsmodel)[c(4:5)], sep="")
xnam2 <- paste(colnames(mtcarsmodel)[c(12:20)], sep="")
fmla <- paste(xnam, collapse= "+")
fmla2 <- paste(paste(fmla), "+")
fla <- paste("mpg ~", paste(fmla2))
models <- lapply(setNames(xnam2, xnam2), function(var) {
form = paste(fla, var)
lm(form, data=mtcarsmodel)
})
modelsummaries <-lapply(models, summary)
coef <- sapply(modelsummaries, function(x) x[[4]][[4,1]])
在与 grep 解决方案斗争之后,我犯了亵渎罪并改用 sql 解决方案:
library('sqldf')
new <- lapply(modelsummaries, function(x) setDT(data.frame(x[[4]]), keep.rownames = TRUE)[])
values <- sapply(new, function(x) sqldf("SELECT x.estimate, x.'Pr...t..' FROM x WHERE rn like '%V_%'"))
data <- as.data.frame(t(rbind(values)))
我还想出了一个(有点难看的)基于 grep 的解决方案:
coef <- sapply(modelsummaries, function(x) as.numeric(unlist(strsplit(grep("^V_", capture.output(x), value = TRUE), "\s+"))[[2]]))
你已经很接近了,你只需要告诉 grep
要搜索的内容,这是 coef()
返回的系数矩阵的行名(这是一种比获取它们更好的方法[[4]]
)。另外,为了不重复使用该名称,我建议将结果保存为不同的名称,例如 coefs
.
coefs <- sapply(modelsummaries, function(x) {
coef(x)[grep("^V", rownames(coef(x))),"Estimate"]
})
V_0.1 V_0.2 V_0.3 V_0.4 V_0.5 V_0.6 V_0.7 V_0.8
0.030927774 -0.053437459 0.009335911 -0.011009187 -0.010303494 -0.001705420 -0.036297492 0.021838044
V_0.9
0.005457086
此外,请查看新的 broom
包,它可以更轻松地以整洁的方式从模型中提取某些信息。