2017-06-13 75 views
0

我有一个模型摘要列表(假设它是线性模型;但是这可能适用于任何模型摘要)。R:使用模式匹配从模型摘要列表中提取值

目前,我使用摘要此列表中提取一定的系数如下:

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]]) 
+1

'[[''只允许一次选择一个元素。如果你的grep导致一个col,你可以使用'grep(pattern,names(x [[10]]))'来获得数字。请参阅'?grep','?names','?\'[[\''等。 – Frank

+0

最好掀起一个模拟结果结构的示例。 – lmo

+0

附上一个例子 – SlyGrogger

回答

1

你我们你只需要告诉grep搜索什么,这是coef()返回的系数矩阵的rownames(这是得到它们的一个比[[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包,它可以更容易地提取模型的某些信息在一个整洁的方式。

0

用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]]))