Изменить типы данных, используя список имен типов данных - PullRequest
4 голосов
/ 26 июня 2019

Что представляет собой элегантный способ изменить типы данных столбцов фреймов данных из списка имен типов данных?

Вот пример (я ищу функцию 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...

Ответы [ 4 ]

6 голосов
/ 26 июня 2019

Опция будет

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" 
5 голосов
/ 26 июня 2019

Весело с 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" 
4 голосов
/ 26 июня 2019

EDIT : Чтобы избежать искажений факторов из-за прямого преобразования чисел в факторы, мы можем сделать:

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])
                   }
                 }
                   )

ORIGINAL

Мы можем сделать:

sapply(seq_along(names(my_df)),
       function(x)  as(my_df[,x],my_types[x]))
0 голосов
/ 26 июня 2019

Мы можем использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...