Частичная замена строк для имен строк во фрейме данных

Мой вопрос больше касается улучшения моих навыков кодирования, чем решения проблемы, поскольку я смог найти решение, но я не нахожу его очень элегантным.

Я работаю над немного более сложной версией опубликованной to-a-spreadsh">здесь. Я запускаю несколько линейных регрессий и хочу экспортировать коэффициенты из них всех в один CSV-файл. Я смог использовать эту информацию для создания списка всех коэффициентов и преобразования его в список кадр данных. Мой список фреймов данных выглядит так:

> coef.df
[[1]]
                    Estimate Std. Error    z value     Pr(>|z|)
(Intercept)      -0.08670899   0.357377 -0.2426261 0.8082950694
Var.0.0.Type.4   22.46262205   5.935317  3.7845698 0.0001539747

[[2]]
                   Estimate Std. Error    z value     Pr(>|z|)
(Intercept)      -0.1682616  0.3590799 -0.4685911 6.393619e-01
Var.0.5.Type.4   15.4974199  3.8693290  4.0051957 6.196616e-05

[[3]]
                   Estimate Std. Error    z value     Pr(>|z|)
(Intercept)      -0.1832488  0.3532577 -0.5187397 6.039423e-01
Var.1.0.Type.4   10.1225605  2.4475064  4.1358668 3.536172e-05

и так далее.

Когда я попытался просто преобразовать этот список в CSV-файл, я перепутал имена столбцов (все термины «Перехват» имели добавленный номер).

                   Estimate Std. Error     z value     Pr(>|z|)
(Intercept)      -0.08670899  0.3573770 -0.24262609 8.082951e-01
Deg.In.0.0.INS.4 22.46262205  5.9353171  3.78456983 1.539747e-04
(Intercept)1     -0.16826164  0.3590799 -0.46859114 6.393619e-01
Deg.In.0.5.INS.4 15.49741993  3.8693290  4.00519568 6.196616e-05
(Intercept)2     -0.18324877  0.3532577 -0.51873968 6.039423e-01
Deg.In.1.0.INS.4 10.12256045  2.4475064  4.13586682 3.536172e-05
(Intercept)3     -0.14188918  0.3426645 -0.41407607 6.788184e-01
Deg.In.1.5.INS.4  6.32348365  1.5164421  4.16994719 3.046702e-05

Я понимаю, что строки должны иметь уникальные имена, и я хочу настроить их, используя имя второго коэффициента для каждой модели. Что я хотел бы сделать, так это создать CSV-файл, в котором будет вся информация в следующем формате с именами строк, скорректированными с учетом того, для какой переменной задан данный Intercept:

                          Estimate Std. Error    z value     Pr(>|z|)
(Intercept.0.0.Type.4)   -0.0867089   0.357377  -0.2426261 0.8082950694
Var.0.0.Type.4           22.4626220   5.935317   3.7845698 0.0001539747
(Intercept.0.5.Type.4)   -0.1682616   0.359079  -0.4685911 6.393619e-01
Var.0.5.Type.4           15.4974199   3.869329   4.0051957 6.196616e-05
(Intercept.1.0.Type.4)   -0.1832488   0.353257  -0.5187397 6.039423e-01
Var.1.0.Type.4           10.1225605   2.447506   4.1358668 3.536172e-05

У меня нет большого опыта манипулирования частичной заменой строк, и хотя я смог это сделать, но я думаю, что мой код не самый простой. Вот как я смог получить этот результат:

#I created a vector containing all row names
df.names <- unlist(lapply(coef.df,rownames)) 
> df.names
 [1] "(Intercept)" "Var.0.0.INS.4" "(Intercept)" "Var.0.5.INS.4" 
 [5] "(Intercept)" "Var.1.0.INS.4" "(Intercept)" "Var.1.5.INS.4" 
 [9] "(Intercept)" "Var.0.0.INS.5" "(Intercept)" "Var.0.5.INS.5"
[13] "(Intercept)" "Var.1.0.INS.5" "(Intercept)" "Var.1.5.INS.5"
#I created a vector with all "(Intercept)" elements from df.names
inter.lm <- df.names[c(TRUE, FALSE)] 
> inter.lm
[1] "(Intercept)" "(Intercept)" "(Intercept)" "(Intercept)" "(Intercept)"
[6] "(Intercept)" "(Intercept)" "(Intercept)"
#I created a vector with all remaining elements from df.names 
var.lm <- df.names[c(FALSE,TRUE)] coefficients
> var.lm
[1] "Var.0.0.Type.4" "Var.0.5.Type.4" "Var.1.0.Type.4" "Var.1.5.Type.4" 
[5] "Var.0.0.Type.5" "Var.0.5.Type.5" "Var.1.0.Type.5" "Var.1.5.Type.5"
#I removed the "Var" part from all elements in var.lm
var.temp <- gsub("Var(.*)", "\\1", var.lm)
> var.temp
[1] ".0.0.Type.4" ".0.5.Type.4" ".1.0.Type.4" ".1.5.Type.4" ".0.0.Type.5"
[6] ".0.5.Type.5" ".1.0.Type.5" ".1.5.Type.5"
#I removed the ")" part from all elements in inter.lm
inter.temp <- gsub("\\)", "", inter.lm) 
> inter.temp
[1] "(Intercept" "(Intercept" "(Intercept" "(Intercept" "(Intercept"
[6] "(Intercept" "(Intercept" "(Intercept"
#I pasted together vectors inter.tepm and var.temp to get the required names 
inter.new <- paste(inter.temp,var.temp,")",sep="")
> inter.new
[1] "(Intercept.0.0.Type.4)" "(Intercept.0.5.Type.4)" "(Intercept.1.0.Type.4)"   
[4] "(Intercept.1.5.Type.4)" "(Intercept.0.0.Type.5)" "(Intercept.0.5.Type.5)"
[7] "(Intercept.1.0.Type.5)" "(Intercept.1.5.Type.5)"
#I merged the inter.new and var.lm vectors to get the correct naming
df.names <- c(rbind(inter.new, var.lm))
> df.names
 [1] "(Intercept.0.0.Type.4)" "Deg.In.0.0.Type.4"     
 [3] "(Intercept.0.5.Type.4)" "Deg.In.0.5.Type.4"     
 [5] "(Intercept.1.0.Type.4)" "Deg.In.1.0.Type.4"     
 [7] "(Intercept.1.5.Type.4)" "Deg.In.1.5.Type.4"  
 [9] "(Intercept.0.0.INS.5)" "Deg.In.0.0.INS.5"     
[11] "(Intercept.0.5.INS.5)" "Deg.In.0.5.INS.5"     
[13] "(Intercept.1.0.INS.5)" "Deg.In.1.0.INS.5"     
[15] "(Intercept.1.5.INS.5)" "Deg.In.1.5.INS.5"     
#Finally I changed the row names
rownames(final.df) <- df.names

Есть ли более простой/краткий способ получить имена, которые я хочу?


person Justyna    schedule 06.03.2017    source источник
comment
Это результат того, что имена строк должны быть разными. Если вы заранее преобразуете их в столбец, вы можете сохранить их, но вам придется превратить матрицу в data.frame. Пример с мурлыканьем: library(purrr); mtcars[-1] %>% map(~lm(mtcars$mpg ~ .x)) %>% map(summary) %>% map_df(broom::tidy, .id = 'variable')   -  person alistaire    schedule 06.03.2017
comment
Я действительно хочу изменить их, как в моем примере. Мой вопрос больше о том, как объединить имена из каждой другой строки в одно имя, сохраняя при этом другую каждую другую строку более эффективно, чем я это сделал.   -  person Justyna    schedule 06.03.2017