R 更改应用类型转换的所有列
我有一个dataframe,我想转换列类型。我实际上有这个功能: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
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)] ))