在r中读取带有混合数字和文本的数据文件

时间:2017-06-03 14:39:04

标签: r import

我的数据文件包含以下内容: 前10列是数字,最后一列是文本。他们被空间隔开。问题是最后一列中的文本也可能包含空格。因此,当我使用read.table()时,我收到以下错误:

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :  
line 21 did not have 11 elements

将前10列读入数据矩阵的最简单方法是什么,最后一列是字符串向量?我应该首先使用readLines()然后处理吗?

4 个答案:

答案 0 :(得分:1)

如果您无法使用不同的非空格分隔符重新导出或重新创建数据文件,或者在最后一列周围使用引号来避免该问题,则可以使用read.table(... , fill = TRUE)read in a file with unequal columns然后将第11列与dat$col11 <- do.call(paste, c(dat[11:nrow(dat)], sep=" "))or something like that)合并,然后使用dat[11:(nrow(dat)-1)] <- NULL删除现在不需要的列。最后,您可能需要使用trimws(dat$col11)修剪第11列末尾的空白。

请注意,fill仅考虑文件的前五行,因此您可能需要手动查找最长行中的“伪列”数,并指定适当的{{1}行数在col.names中(参见链接的答案)。

答案 1 :(得分:0)

fill = TRUE函数的有用read.table()选项暗示,我使用以下方法解决了我的问题:

dat <- read.table(fname, fill = T)
dat <- dat[subset(1:nrow(dat),!((1:nrow(dat)) %in% (which(dat[,11]=="No") + 1))),]

fill = TRUE选项将第11列第一个空格后的所有内容放入新行(原始数据没有的冗余行)。上面的代码基于三个假设删除冗余行:(1)第11列中的空格分隔符的数量不超过11​​,这样我们就知道在第11列包含空格的行之后只有一行文本(这就是+1的作用; (2)我们知道第11列以某个单词开头的行(在我的例子中是“否”)(3)仅保留第11列中的第一个单词就足够了(没有歧义)。

答案 2 :(得分:0)

在R中读取文件之前,您可以重新格式化文件。 例如,在终端中使用>>>

perl

这将用逗号替换前面带有数字的每个空格。 然后使用perl -pe 's/(?<=[0-9]) /,/g' myfile.txt > myfile.csv

将其读入R.
read.csv

答案 3 :(得分:0)

以下解决了我的问题:

nc <- max(count.fields(fname), sep = " ")
data <- read.table(fname, fill = T, col.names = paste0("V", seq_len(nc)), sep = " ", header = F)

然后前10列将是我想要的数值结果,其余的nc-10列可以组合成一个字符串向量。 最有用的帖子是: How can you read a CSV file in R with different number of columns