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

#r #function #dplyr

#r #функция #dplyr

Вопрос:

Я пытаюсь создать пользовательскую функцию для присвоения меток измененному списку фреймов данных. Например, у меня есть фрейм данных, как показано ниже.

 data<-data.frame( Q1=c(1,1,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,1,1,1,NA,1,1,NA,NA,NA,NA,1,NA,NA,NA,NA,1,NA,1),
                  Q2=c(1,1,1,1,1,NA,NA,NA,NA,1,1,1,1,1,NA,NA,NA,1,1,1,NA,1,1,1,1,1,NA,NA,NA,1,1,1,1,1,1,1,NA,NA,NA),
                  Q3=c(1,1,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,1,1,1,NA,NA,NA,1,NA,NA,1,1,1,1,1,NA,NA,1),
                  Q4=c(1,NA,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
                  Q5=c(NA,1,NA,NA,1,NA,1,1,NA,NA,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,NA,1,NA,1,NA,1,NA,1,NA),
                  Q6=c(1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,1,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,1,1,1,1,1,1,NA,1,NA,1,1,NA,1),
                  Q7=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  Q8=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  region=c(1,2,1,1,1,2,1,2,2,1,2,NA,1,1,2,2,2,1,1,1,2,NA,2,1,1,1,2,2,2,NA,1,2,2,1,1,1,2,2,2)
)  

  

Комментарии:

1. кажется, начало определения вашего примера data потеряно

2. неясно, что ваша функция должна принимать в качестве рабочих данных: в вашем примере с coalesce() помощью вы изменяете dataframe ( data ) , но в вашем conv_fac() примере вызова вы, похоже, передаете список с df помощью и df2 dataframes .

3. Я только что обновил вопрос

4. опять же, неясно, какой ввод ожидается для вашей функции. Это список из 2 фреймов данных, и оба они будут обрабатываться так же, как data в вашем примере? Должны ли они всегда называться ALL и other ?

Ответ №1:

 conv_fac <- function(
  dataset, # list containing input dataframes
  labels   # list of vectors; in each vector, first label is destination column and all the rest are sources
  ){
  for (i in seq_len(length(dataset))){
    this_df <- dataset[[i]]
    for (this_label in labels){
      col_target <- this_label[1]
      cols_source <- this_label[-1]
      vecs <- this_df[,cols_source]
      cat('nProcessing dataframe #',i,': column ',col_target, ' from columns ', paste0(cols_source, collapse = ', '),  sep = '')      
      this_df[[col_target]] <- coalesce(!!!vecs) 
    }
    this_df -> dataset[[i]]
  }
  return(dataset)
}

# Usage:

ldat <- list("ALL" = df, "other" =df2) 
var1 <- c("Q9","Q8","Q4")
var2 <- c("Q7","Q6","Q5")

ldat2 <- conv_fac(dataset = ldat, labels = list(var1,var2))
  

Комментарии:

1. таким образом, ldat может быть списком из многих фреймов данных, иметь много фрагментов, которые должны быть помечены для n числа списка переменных

2. да, предоставленный мной код будет работать для всех фреймов данных, содержащихся во dataset вводе списка

3. для сценария, подобного списку факторов и меток, col_name <- c(«Q1», «Q2″,»Q3», «Q4») label <- c(«asman», «shakti», «nakul», «ram») я создал функцию conv_frac <- function(dataset, colnames, collabels) {lapply(dataset, function(p) { p[colnames] <- Map(функция (x, y) фактор (x, метки = y), p[colnames], collabels) p }) } и я применяю как ldat1 <- conv_frac(dataset = ldat, colnames = col_name,collabels = label) итак, могу ли я получить простое решение, подобное этому, чтобы в будущем я мог легко изменять.

4. для меня это немного сложно

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