我有一个这样的数据框架:
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"))理想情况下,我希望使用一种通用的方法,该方法可以应用于具有动态列数的数据帧。
发布于 2020-12-13 13:12:44
你只需要编写你自己的函数来做清理。这里有一种可能性
fix_data <- function(data, types=NULL, flevels=NULL) {
if(!is.null(types) && 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) && 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遍历列表中的名称和值。
https://stackoverflow.com/questions/65272440
复制相似问题