使用数据类型名称列表更改数据类型

Vla*_*lad 4 r dataframe dplyr data.table

从数据类型名称列表更改数据框列的数据类型的一种优雅方法是什么?

这是一个例子(我正在寻找的是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)
Run Code Online (Sandbox Code Playgroud)

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...
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

一个选择是

library(tidyverse)
my_df[] <- map2(my_df, str_c("as.", my_types), ~ get(.y)(.x))
Run Code Online (Sandbox Code Playgroud)

或在 base R

my_df[] <- Map(function(x, y) get(y)(x), my_df, paste0("as.", my_types))
Run Code Online (Sandbox Code Playgroud)

-再次检查课程

sapply(my_df, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#    "factor"  "character"    "numeric"    "logical"  "character" 
Run Code Online (Sandbox Code Playgroud)


zx8*_*754 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" 
Run Code Online (Sandbox Code Playgroud)