R 更改应用类型转换的所有列

R 更改应用类型转换的所有列,r,dplyr,R,Dplyr,我有一个dataframe,我想转换列类型。我实际上有这个功能: library(dplyr) convertDfTypes <- function(obj, types) { for (i in 1:length(obj)){ FUN <- switch(types[i], character = as.character, numeric = as.numeric, factor = a

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

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
库(dplyr)

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

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)
在dplyr包中使用transmute函数这将使用指定的函数创建一个新列,并在旧数据框中删除列

library("dplyr")

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

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

假设要将所有int列转换为numeric,可以使用一个管道:

myDf %>%  mutate_each_( funs(as.numeric(.)), names( .[,sapply(., is.integer)] ))

如果你提供一个最小的可重复的例子,你就更有可能得到答案。请看Hadley的回复:我知道窗口函数(我在函数中使用
mutate
),我不想手动转换数据帧的每一列。我想做一个函数。这就是我的函数实际所做的,但不是以优化的方式。在
mutate_each
mutate_each
之间有什么区别吗?
str(df_new)
myDf %>%  mutate_each_( funs(as.numeric(.)), names( .[,sapply(., is.integer)] ))