R: задайте тип и уровни переменных во фрейме данных на основе списка

#r

#r

Вопрос:

У меня есть такой фрейм данных:

 df <- data.frame(
  v1 = sample(c("L1","L2"),5,replace = TRUE), 
  v2 = sample(c("F1","F3"),5,replace = TRUE),
  v3 = sample(seq(1,5),5,replace = T)
)
 

Я хочу (1) установить тип переменных на основе именованного списка:

 typs <- list("v1" = "factor", "v2" = "factor", "v3" = "numeric")
 

и (2) для установки уровней факторных переменных:

 list.levels <-  list("v1" = c("L1","L2","L3"), "v2" = c("F1","F2","F3"))
 

В идеале я хотел бы использовать обобщенный подход, который можно было бы применить к фреймам данных с динамическим числом столбцов.

Ответ №1:

Вам просто нужно написать свою собственную функцию для очистки. Вот одна из возможностей

 fix_data <- function(data, types=NULL, flevels=NULL) {
  if(!is.null(types) amp;amp; length(types)>0) {
    data[,names(types)] <- Map(function(col, type) {
      if (type=="factor") {
        factor(data[[col]])
      } else if (type=="numeric") {
        as.numeric(data[[col]])
      } else {
        stop(paste("unsupported type:", type))
      }
    }, names(types), types)
  }
  if(!is.null(flevels) amp;amp; length(flevels)>0) {
    data[,names(flevels)] <- Map(function(col, levels) {
      factor(data[[col]], levels=levels)
    }, names(flevels), flevels)
  }
  data
}
 

А затем назовите это как fix_data(df, typs, list.levels) . Обратите внимание, что он возвращает новый data.frame, чтобы вы могли либо перезаписать оригинал, либо сохранить его в новой переменной.

Основная идея заключается в том, чтобы просто перебирать имена в вашем списке и выполнять правильное преобразование. Мы используем Map для перебора имен и значений в вашем списке.