将制表符分隔的数据读入R中

17

我正在尝试将一个大型制表符分隔的文件读入R。

首先我尝试了这个:

data <- read.table("data.csv", sep="\t")

但它将一些数字变量读取为因子

所以我尝试根据每个变量想要的类型来读取数据,像这样:

data <- read.table("data.csv", sep="\t", colClasses=c("character","numeric","numeric","character","boolean","numeric"))

但是当我尝试这样做时,它会给我一个错误:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : scan()期望得到“一个实数”,但却得到了“'4'”

我认为原始文件中某些数字值周围有引号可能是原因之一,但我不确定。

2个回答

8

在未看到您的数据之前,可能有以下几种情况:数据中没有全部分隔符;单个观测中嵌入了制表符;或其他类似情况。

解决方法是设置options(stringsAsFactors=FALSE),然后使用第一行代码。

查看str(data)并尝试找出哪些行是问题所在。数值被当作因子读取的原因是该列中有某些内容被R解释为字符,从而强制将整个列转换为字符。通常需要深挖,但问题几乎肯定源于输入文件。

这是常见的数据处理问题,祝好运!


谢谢您的回复。这很有帮助,但是我想导入数字变量,而不是导入变量。当我尝试将其转换为数字变量时,它会给我所有观测值的NA。不过,我会仔细查看数据以检查您提出的建议。 - Ford
哦,仔细看看你的错误,你引用了四个引号。R在它周围加了一组额外的单引号' " 4 " '。这意味着在你的tsv文件中,你的数字被引用了,因此被视为字符。在你的read.table行中添加quote='"',看看它是否适用于你。 - Justin
问题明显是我的原始数据文件中的值用引号括起来,因此它将这些值读取为字符而不是数字。我尝试了你上面提到的quote='"',但那并没有解决问题...原始数据文件太大了,因此我无法在文本编辑器或Excel中删除引号,否则程序就会崩溃。 - Ford
1
如果你使用的是Linux或Unix系统,你可以使用命令行工具sed。sed -i s/\"//g filename 可以删除所有的 " 符号。但这可能不是你想要的... - Justin
是的,我能够使用命令行删除引号。然后我可以读取数据并正确地将其转换为数字。谢谢! - Ford

1
x <- paste("'",floor(runif(10,0,10)),"'",sep="")
x

 [1] "'7'" "'3'" "'0'" "'3'" "'9'" "'1'" "'4'" "'8'" "'5'" "'8'"

as.numeric(gsub("'", "",x))

 [1] 7 3 0 3 9 1 4 8 5 8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接