为什么read.table无法在R中准确识别制表符分隔的标题

时间:2013-11-29 11:26:40

标签: r read.table

我有以下data

GOBPID  Term    ADX_KD_06.ip    ADX_KD_24.ip    ADX_LG_06.ip (more columns)
GO:0000003  reproduction    0   0   0
GO:0000165  MAPK cascade    0   0   0
(more rows)

当我读到它时,如下所示

d1 <- read.table("http://dpaste.com/1487049/plain/",sep="\t",header=TRUE)

我希望d1$GOBPID包含GO:0000003等值,但会访问Term列 代替。

> d1$GOBPID
[1] reproduction   MAPK cascade ....

基本上,它没有按原样分配标题列。 这是为什么?什么是正确的方法?

2 个答案:

答案 0 :(得分:4)

您的实际数据有多大?

正如Richie Cotton所指出的,count.fields对于确定数据的每一行中有多少分隔符非常有用。但是,在这种情况下,在显示制表符字符的正常文本编辑器中打开文件会更有用,并且您会看到除第一行之外的每一行都有一个尾随制表符。由于所有其他行的标签比第一行多一个,因此R假定第一个“列”应该是row.names,这会导致您遇到的问题。

以下是此数据的两种可能选项:

选项1

如果您的数据很小,这很方便:使用gsub删除尾随标签,并在输出中使用read.delim

read.delim(text = gsub("\\t$", "", 
                       readLines("http://dpaste.com/1487049/plain/")))

选项2

在跳过第一行时读取表格,删除最后一列(应该是所有NA值),然后使用scan读取第一行来添加名称:

out <- read.delim("http://dpaste.com/1487049/plain/", 
                  skip = 1, header = FALSE)
out <- out[-length(out)]
names(out) <- scan("http://dpaste.com/1487049/plain/", 
                   what="", n=length(out), sep = "\t")

答案 1 :(得分:2)

您可能在某处有空格字符而不是标签,或其他格式不正确的数据。运行

count.fields("http://dpaste.com/1487049/plain/", sep = "\t")

查看导致问题的行。