假设我有两个大数据帧,一个用于存储数据作为字符,另一个用于指定给定数据帧的每个列的数据类型。
例如:
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
中指定的数据类型?
答案 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