从数据类型名称列表中更改数据框列的数据类型的一种优雅方法是什么?
这是一个示例(我正在寻找的是change_to_data_types函数):
my_df <- iris
my_types <- c("factor", "character", "double", "logical", "character")
my_df <- my_df %>% change_to_data_types(my_types)
my_types
具有与my_df
中的列数相同的元素数,并且转换以相同的顺序进行。
这是一种“不礼貌”的方式
my_df$Sepal.Length <- my_df$Sepal.Length %>% as.factor()
my_df$Sepal.Width <- my_df$Sepal.Width %>% as.character()
#etc...
答案 0 :(得分:6)
一个选项是
library(tidyverse)
my_df[] <- map2(my_df, str_c("as.", my_types), ~ get(.y)(.x))
或者在base R
my_df[] <- Map(function(x, y) get(y)(x), my_df, paste0("as.", my_types))
-再次检查课程
sapply(my_df, class)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# "factor" "character" "numeric" "logical" "character"
答案 1 :(得分:5)
玩 match.fun 有趣:
my_df[] <- lapply(seq_along(names(my_df)),
function(i) match.fun(paste0("as.", my_types[ i ]))(my_df[[ i ]]))
sapply(my_df, class)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# "factor" "character" "numeric" "logical" "character"
答案 2 :(得分:4)
编辑: 为了避免因将数字直接转换为因子而导致因子畸形,我们可以这样做:
lapply(seq_along(names(my_df)),
function(x){
if(is.numeric(my_df[,x]) &
my_types[x] =="factor"){
as.factor(as.character(my_df[,x]))
}
else{
as(my_df[,x],my_types[x])
}
}
)
原始:
我们可以做到:
sapply(seq_along(names(my_df)),
function(x) as(my_df[,x],my_types[x]))
答案 3 :(得分:0)
我们可以使用mapply
来填充utils::as
对列和类型。这不适用于因子列,因此需要单独处理。
fcols <- my_types == "factor"
my_df[!fcols] <- mapply(as, my_df[!fcols], my_types[!fcols], SIMPLIFY = FALSE)
my_df[fcols] <- lapply(my_df[fcols], factor)