2017-06-13 83 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]]))