我有一个数据框,我想转换列类型。我实际上有这个功能:
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
,但为每列使用不同的函数,而对所有列使用不同的函数。
您有什么想法来改善这项功能吗?
谢谢
答案 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)