我有以下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 ....
基本上,它没有按原样分配标题列。 这是为什么?什么是正确的方法?
答案 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")
查看导致问题的行。