为了账号安全,请及时绑定邮箱和手机立即绑定

一次转换数据框的多个列的类型

一次转换数据框的多个列的类型

月关宝盒 2019-12-27 15:30:03
我似乎花了很多时间从文件,数据库或其他东西创建一个数据框,然后将每一列转换成我想要的类型(数字,因子,字符等)。有没有一种方法可以一步一步做到这一点,可能是通过提供类型向量来实现的?foo<-data.frame(x=c(1:10),                 y=c("red", "red", "red", "blue", "blue",                     "blue", "yellow", "yellow", "yellow",                     "green"),                z=Sys.Date()+c(1:10))foo$x<-as.character(foo$x)foo$y<-as.character(foo$y)foo$z<-as.numeric(foo$z)而不是最后三个命令,我想做类似的事情foo<-convert.magic(foo, c(character, character, numeric))
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

我对Brandon的回答的评论switch如下:


convert.magic <- function(obj,types){

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

        FUN <- switch(types[i],character = as.character, 

                                   numeric = as.numeric, 

                                   factor = as.factor)

        obj[,i] <- FUN(obj[,i])

    }

    obj

}


out <- convert.magic(foo,c('character','character','numeric'))

> str(out)

'data.frame':   10 obs. of  3 variables:

 $ x: chr  "1" "2" "3" "4" ...

 $ y: chr  "red" "red" "red" "blue" ...

 $ z: num  15254 15255 15256 15257 15258 ...

对于真正的大数据帧,您可能要使用lapply而不是for循环:


convert.magic1 <- function(obj,types){

    out <- lapply(1:length(obj),FUN = function(i){FUN1 <- switch(types[i],character = as.character,numeric = as.numeric,factor = as.factor); FUN1(obj[,i])})

    names(out) <- colnames(obj)

    as.data.frame(out,stringsAsFactors = FALSE)

}

执行此操作时,请注意R中强制数据的一些复杂性。例如,从因数转换为数值通常涉及as.numeric(as.character(...))。此外,要注意data.frame()和as.data.frame()S转换性格因素的默认行为。


查看完整回答
反对 回复 2019-12-27
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我知道我回答的时间很晚,但是将循环和属性函数一起使用是解决问题的简单方法。


names <- c("x", "y", "z")

chclass <- c("character", "character", "numeric")


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

  attributes(foo[, names[i]])$class <- chclass[i]

}


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 727 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信