将数据类型分配给R中数据帧的每一列

时间:2014-06-05 18:39:37

标签: r dataframe

假设我有两个大数据帧,一个用于存储数据作为字符,另一个用于指定给定数据帧的每个列的数据类型。

例如:

my.df = data.frame(
    id = c('122','345', '43'), 
    name = c('john','matt','roger'), 
    race = c('1','2','1'), 
    age = c('20','23','34'), 
    height = c('6.4', '5.7', '4.9')
) 

cols.of.my.df.type.df = data.frame(
    col.name.in.my.df = c('id','name', 'race', 'age', 'height', 
    c('string', 'string', 'integer, encoded value', 'integer', 'decimal')
)

cols.of.my.df.type中的类型与R中的类型不同,但我也在寻找R数据类型I也应该指定列的建议。

是否有快速方法将my.df的数据类型转换为cols.of.my.df.type中指定的数据类型?

2 个答案:

答案 0 :(得分:0)

您可以定义强制函数(与db驱动程序使用相同的技术):

MyType2RType <- function(obj,...)
{
  switch(obj ,
         "decimal"="numeric",
         "integer, encoded value"="factor",
         "integer"="integer",
         "string"= "character")
}

您可以像这样使用它(它不是一个完整的解决方案,只是基于评论的提示)

cols = list(
  name = c('id','name', 'race', 'age', 'height'),
  type=  c('string', 'string', 'integer, encoded value', 'integer', 'decimal')
  )

read.table(...,colClasses= sapply(cols$type,MyType2RType))

答案 1 :(得分:0)

使用您的数据:

df <- data.frame(
    id = c('122','345', '43'), 
    name = c('john','matt','roger'), 
    race = c('1','2','1'), 
    age = c('20','23','34'), 
    height = c('6.4', '5.7', '4.9'),
    stringsAsFactors = FALSE
) 

cols <- data.frame(
    name = c('id','name', 'race', 'age', 'height'),
    type = c('string', 'string', 'integer, encoded value', 'integer', 'decimal'),
    stringsAsFactors = FALSE)

这是一种做你想要的方法,假设按照上面的设置。请注意,stringsAsFactors = FALSE在上述定义中非常重要。

foo <- function(i, data, colInfo) {
  ## mapping your types to R's types
  RTypes <- c(string = "character", `integer, encoded value` = "factor",
              integer = "integer", decimal = "double")
  ## get current type
  TYPE <- colInfo$type[i]
  ## match this against the mapping vector
  RTYPE <- RTypes[TYPE]
  ## if a factor coerce via as.factor
  if (RTYPE == "factor") {
    out <- as.factor(data[, i])
  } else { ## otherwise convert via storage.mode()
    out <- data[,i]
    storage.mode(out) <- RTYPE
  }
  out # return
}

tmp <- lapply(seq_len(nrow(cols)), foo, df, cols)
names(tmp) <- names(df)
tmp <- data.frame(tmp, stringsAsFactors = FALSE)

tmp
str(tmp)

给出了:

> tmp
   id  name race age height
1 122  john    1  20    6.4
2 345  matt    2  23    5.7
3  43 roger    1  34    4.9
> str(tmp)
'data.frame':   3 obs. of  5 variables:
 $ id    : chr  "122" "345" "43"
 $ name  : chr  "john" "matt" "roger"
 $ race  : Factor w/ 2 levels "1","2": 1 2 1
 $ age   : int  20 23 34
 $ height: num  6.4 5.7 4.9