Добавьте имена объектов data.frame из списка в столбцах указанного списка объектов data.frame.

Я хочу знать, как добавить имена объектов data.frame из списка в столбцах в указанном списке объектов data.frame.

Я создал список объектов lm(), в которых различаются только DV (известные как DV_col) (либо mpg, drat, disp). Общий формат lm(): lm( DV_col ~ cyl, data = mtcars).

# sets up data

## list of DVs to use
mtcars_DVs <- data.frame(c("mpg", "drat", "disp"))
names(mtcars_DVs)[names(mtcars_DVs) == "c..mpg....drat....disp.."] <- "Variable_name"
mtcars_DVs$Variable_name <- as.character(mtcars_DVs$Variable_name)

## creates lm object list
# ---- NOTE: creates object list
lm_list <-
  lapply(mtcars_DVs$Variable_name,
         function(DV_list) wrapr::let(
           c(DV_col = DV_list, 
             dataset_obj = "mtcars", 
             IV_col_key = "cyl"), 
           (lm(
             DV_col ~ 
               IV_col_key, 
             data = dataset_obj
           )
           )
         )
  )
# ---- NOTE: changes list object name
lm_list <- 
  setNames(lm_list, paste("lm_list", 
                          mtcars_DVs$Variable_name,
                          sep = "__")
  )


Затем я использовал confint() в списке, чтобы создать список объектов confint, и превратил его в список фреймов данных с конкретными именами на основе DV для каждого фрейма данных.


## creates coef object
lm_confint_list <- 
  lapply(
    lm_list, 
    function(model_list) {
      confint(model_list)
    }
  )
# ---- NOTE: changes list object name
lm_confint_list <- 
  setNames(lm_confint_list, paste("lm_confint_list", 
                          mtcars_DVs$Variable_name,
                          sep = "__")
  )
# ---- NOTE: creates unique objects for each part list object
list2env(lm_confint_list, .GlobalEnv)
# ---- NOTE: gathers objects with prefix
apropos("lm_confint_list")


## turns lm_confint_list into data frame
lm_confint_df_list <- 
  lapply(
    lm_confint_list, 
    function(model_list) {
      data.frame(model_list, header = TRUE)
    }
  )
# ---- NOTE: changes list object name
lm_confint_df_list <- 
  setNames(lm_confint_df_list, paste("lm_confint_df_list", 
                                  mtcars_DVs$Variable_name,
                                  sep = "__")
  )
# ---- NOTE: creates unique objects for each part list object
list2env(lm_confint_df_list, .GlobalEnv)
# ---- NOTE: gathers objects with prefix
apropos("lm_confint_df_list")

Теперь я хочу (1) добавить переменную в каждый список во фрейме данных, в котором просто повторяется имя списка фрейма данных, называемое object_name. Затем я хочу (2) удалить часть текста из этой переменной, чтобы создать переменную только с DV, специфичным для этого анализа, для каждого объекта в списке Variable_name.

Я хочу сделать (1) и (2) с использованием повторяющегося кода без необходимости ручного ввода, ожидайте, если я изменю характер объекта mtcars_DVs$Variable_name (т.е. добавлю или удалю возможные зависимые переменные, которые будут использоваться для создания списков моделей) .

Это возможно? Я знаю, как сделать это длинным путем со значительным количеством ручного ввода, но не коротким и многократным путем с минимальным ручным вводом.

Спасибо заранее.



Вот долгий путь выполнения (1) и (2):

# long way of adding column with object name, will do one confint(), process can be repeated for other variables

## adds as column with name of object to object via manual text input
# ---- NOTE: REQUIRES MANUAL INPUT
lm_confint_df_list__disp$object_name <- "lm_confint_df_list__disp"

## creates column with DV from object_name variable
lm_confint_df_list__disp$Variable_name <- 
  gsub(".*__","",lm_confint_df_list__disp$object_name)


Вот завершенный вывод одного из результатов lm confint:

> lm_confint_df_list__disp
                X2.5..   X97.5.. header              object_name Variable_name
(Intercept) -228.45716 -84.76080   TRUE lm_confint_df_list__disp          disp
cyl           51.42909  73.76876   TRUE lm_confint_df_list__disp          disp


Вот весь код, который я использовал.



# sets up data

## list of DVs to use
mtcars_DVs <- data.frame(c("mpg", "drat", "disp"))
names(mtcars_DVs)[names(mtcars_DVs) == "c..mpg....drat....disp.."] <- "Variable_name"
mtcars_DVs$Variable_name <- as.character(mtcars_DVs$Variable_name)

## creates lm object list
# ---- NOTE: creates object list
lm_list <-
  lapply(mtcars_DVs$Variable_name,
         function(DV_list) wrapr::let(
           c(DV_col = DV_list, 
             dataset_obj = "mtcars", 
             IV_col_key = "cyl"), 
           (lm(
             DV_col ~ 
               IV_col_key, 
             data = dataset_obj
           )
           )
         )
  )
# ---- NOTE: changes list object name
lm_list <- 
  setNames(lm_list, paste("lm_list", 
                          mtcars_DVs$Variable_name,
                          sep = "__")
  )

## creates coef object
lm_confint_list <- 
  lapply(
    lm_list, 
    function(model_list) {
      confint(model_list)
    }
  )
# ---- NOTE: changes list object name
lm_confint_list <- 
  setNames(lm_confint_list, paste("lm_confint_list", 
                          mtcars_DVs$Variable_name,
                          sep = "__")
  )
# ---- NOTE: creates unique objects for each part list object
list2env(lm_confint_list, .GlobalEnv)
# ---- NOTE: gathers objects with prefix
apropos("lm_confint_list")

## turns lm_confint_list into data frame
lm_confint_df_list <- 
  lapply(
    lm_confint_list, 
    function(model_list) {
      data.frame(model_list, header = TRUE)
    }
  )
# ---- NOTE: changes list object name
lm_confint_df_list <- 
  setNames(lm_confint_df_list, paste("lm_confint_df_list", 
                                  mtcars_DVs$Variable_name,
                                  sep = "__")
  )
# ---- NOTE: creates unique objects for each part list object
list2env(lm_confint_df_list, .GlobalEnv)
# ---- NOTE: gathers objects with prefix
apropos("lm_confint_df_list")




# long way of adding column with object name, will do one confint(), process can be repeated for other variables

## adds as column with name of object to object via manual text input
# ---- NOTE: REQUIRES MANUAL INPUT
lm_confint_df_list__disp$object_name <- "lm_confint_df_list__disp"

## creates column with DV from object_name variable
lm_confint_df_list__disp$Variable_name <- 
  gsub(".*__","",lm_confint_df_list__disp$object_name)



person Mel    schedule 01.04.2021    source источник


Ответы (1)


Вы можете сделать это с помощью Map :

lm_confint_df_list <- Map(function(x, y) 
            data.frame(x, object_name = y, Variable_name = gsub(".*__","",y), 
            check.names = FALSE), lm_confint_list, names(lm_confint_list))

lm_confint_df_list

#$lm_confint_list__mpg
#                2.5 %    97.5 %          object_name Variable_name
#(Intercept) 33.649223 42.119930 lm_confint_list__mpg           mpg
#cyl         -3.534237 -2.217343 lm_confint_list__mpg           mpg

#$lm_confint_list__drat
#                 2.5 %     97.5 %           object_name Variable_name
#(Intercept)  4.3803292  5.4059919 lm_confint_list__drat          drat
#cyl         -0.2892782 -0.1298242 lm_confint_list__drat          drat

#$lm_confint_list__disp
#                 2.5 %    97.5 %           object_name Variable_name
#(Intercept) -228.45716 -84.76080 lm_confint_list__disp          disp
#cyl           51.42909  73.76876 lm_confint_list__disp          disp

Поместите отдельные объекты в глобальную переменную.

list2env(lm_confint_df_list, .GlobalEnv)   
person Ronak Shah    schedule 01.04.2021