我的数据文件包含以下内容:
前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()
然后处理吗?
答案 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
:
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