使用read.table将字符矩阵从readLines转换为等效的data.frame

时间:2016-05-10 05:28:14

标签: r

使用此问题的解决方案时遇到问题:

Why the field separator character must be only one byte?

我的文件包含以~~~分隔的列,当然read.table失败,错误为invalid 'sep' value: must be one byte。我用Google搜索并找到了上述问题,该问题成功地将文件读入字符矩阵。

但是,我现在想将此字符矩阵转换为数据框,自动为每个列分配类型,并确定规则,如果read.table对原始文件有效,例如:日期和字符串转换为因子等。

1 个答案:

答案 0 :(得分:1)

Code: ABM TWO: Gender: M - 0 Code: GAS ONE: one Gender: F - 1 Code: HUMMS TWO: Gender: M - 0 Code: STEM TWO: Gender: M - 0 有一个辅助函数read.table,其帮助文件说明:

  

这主要是read.table的辅助函数。给定一个字符向量,它会尝试将其转换为逻辑,整数,数字或复数,并且无法将其转换为因子,除非as.is = TRUE。选择可接受所有非缺失值的第一种类型。

utils::type.conversion中调用此函数的位是:

read.table

其中省略号处理在 for (i in (1L:cols)[do]) { data[[i]] <- if (is.na(colClasses[i])) type.convert(data[[i]], as.is = as.is[i], dec = dec, numerals = numerals, na.strings = character(0L)) ... } 调用中配置的列类型。

就我的目的而言,以下就足够了:

read.table

其中df2 <- do.call(rbind,strsplit(readLines('test.txt'),'~~~',fixed=T)) df2_processed <- setNames( as.data.frame(lapply(1:ncol(df2), function(i) { type.convert(df2[,i])}), stringsAsFactors = FALSE), paste0('v', 1:ncol(df2))) 是以下文本文件:

test.txt