改变应用类型转换的所有列

时间:2015-05-15 09:59:36

标签: r dplyr

我有一个数据框,我想转换列类型。我实际上有这个功能:

library(dplyr)

convertDfTypes <- function(obj, types) {

  for (i in 1:length(obj)){

    FUN <- switch(types[i], character = as.character, 
                  numeric = as.numeric, 
                  factor = as.factor, 
                  integer = as.integer, 
                  POSIXct = as.POSIXct, 
                  datetime = as.POSIXct)

    name <- names(obj)[i]

    expr <- paste0("obj %<>% mutate(", name, " = FUN(", name, "))")

    eval(parse(text = expr))
  }

  return(obj)
}

myDf <- data_frame(date = seq(Sys.Date() - 4, Sys.Date(), by = 1), 
                   x = 1:5,
                   y = 6:10)

colTypes <- c("character", "character", "integer")

str(myDf)

# Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  3 variables:
#   $ date: Date, format: "2015-05-11" "2015-05-12" ...
# $ x   : int  1 2 3 4 5
# $ y   : int  6 7 8 9 10

myDf %>% 
  convertDfTypes(colTypes) %>% 
  str

# Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  3 variables:
#   $ date: chr  "2015-05-11" "2015-05-12" "2015-05-13" "2015-05-14" ...
# $ x   : chr  "1" "2" "3" "4" ...
# $ y   : int  6 7 8 9 10

(我第一次使用obj[,i] <- FUN(obj[,i])但这不太可能适用于类tbl的对象

即使在“大型”数据帧上进行复杂类型转换(例如日期/日期时间)的速度很慢,它也能正常工作。但我不知道使用eval(parse对于列替换是一个好主意,我认为可以在不使用for循环的情况下改进该函数。

有没有办法将不同的函数应用于每一列,例如mutate_each,但为每列使用不同的函数,而对所有列使用不同的函数。

您有什么想法来改善这项功能吗?

谢谢

2 个答案:

答案 0 :(得分:2)

以下是实现转换列类型目标的更通用方法:

假设您要将所有 int 列转换为数字,您可以使用一个管道进行转换:

def create
  self.resource = warden.authenticate!(auth_options)
  # set_flash_message!(:notice, :signed_in)
  sign_in(resource_name, resource)
  yield resource if block_given?
  respond_with resource, location: after_sign_in_path_for(resource)
end

答案 1 :(得分:0)

创建数据框此数据框中的每一列都是类型因子

numbers <- c("2001" ,"2002" ,"2002" ,"2002" ,"2003" ,"2005")

dates_string <- c("01-01-1989","01-07-1989","01-08-1989","01-09-1989",
"01-10-1989","01-11-1989")

gender <- c("male" , "female" ,"male" , "female" , "male" , "female")

df <- data.frame(numbers = numbers , dates_string = dates_string , gender = gender)

检查数据框的结构

str(df)

在dplyr包中使用transmute函数,这将创建一个包含指定函数的新列,并删除旧数据框中的列

library("dplyr")

df_new <- transmute( df, numbers_new = as.numeric(numbers) , 
dates_new = as.Date(dates_string) , gender_new = as.factor(gender))

检查新创建的数据框的结构

str(df_new)