#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
для перебора имен и значений в вашем списке.