R中的read.table和注释

时间:2012-10-07 18:44:32

标签: r metadata read.table

我想将元数据添加到我的电子表格中作为评论,然后让R忽略这些。

我的数据格式为

v1,v2,v3,
1,5,7,
4,2,1,#possible error,

(例外情况是它更长。第一条评论实际上显示在前5行之外,由scan用来确定列数)

我一直在努力:

read.table("data.name",header=TRUE,sep=",",stringsAsFactors=FALSE,comment.char="#")

但是read.table(并且,就此而言,count.fields)认为我还有一个比我实际做的更多的领域。我的数据框最后是一个名为“X”的空白列。我想这是因为我的电子表格程序在每一行的末尾都添加了逗号(如上例所示)。

使用flush=TRUE无效,即使(根据帮助文件),“[...]允许在最后一个字段[...]后面添加注释”

使用colClasses=c(rep(NA,3),NULL)也没有效果。

我之后可以删除该列,但由于这似乎是一种常见的做法,我想学习如何正确地做到这一点。

谢谢,

安德鲁

2 个答案:

答案 0 :(得分:5)

来自doc(?read.table):

  

colClasses 字符。要为列假定的类向量。根据需要进行回收,或者如果命名了字符向量,则未指定的值将被视为NA。

     

可能的值是NA(默认情况下,当使用type.convert时),“NULL”(当跳过列时),原子矢量类之一(逻辑,整数,数字,复数,字符,原始),或“因素”,“日期”或“POSIXct”。否则,需要有一个as方法(来自包方法),用于从“character”转换为指定的正式类。

请注意,它表示使用"NULL",而不是NULL。实际上,这可以按预期工作:

con <- textConnection("
v1,v2,v3,
1,5,7,
4,2,1,#possible error,
")

read.table(con, header = TRUE, sep = ",",
           stringsAsFactors = FALSE, comment.char = "#",
           colClasses = c(rep(NA, 3), "NULL"))
#   v1 v2 v3
# 1  1  5  7
# 2  4  2  1

答案 1 :(得分:4)

关于注释字符和数据列数的问题与read.table()无关,但与电子表格无关(我使用的是Excel)。 read.table的默认行为是将#作为注释的开头处理,并忽略后面的内容。您收到错误的原因是因为数据行末尾有一个逗号。这告诉read.table应该遵循更多数据。阅读原始示例:

> read.table(text="v1, v2, v3,
+  1,5,7,
+  4,2,1,#possible error,", sep=",", header=TRUE)
  v1 v2 v3  X
1  1  5  7 NA
2  4  2  1 NA

默认情况下会忽略注释,并创建第四列并标记为X.您可以在事实之后轻松删除此列,或者使用@flodel提到的方法,或者可以在将文件读入R之前删除尾随逗号。在Excel中,将文件另存为csv(逗号分隔变量)时会添加尾随逗号,因为注释显示在第四列中,Excel不会将其识别为注释。如果将文件保存为以空格分隔,则问题消失(删除sep =参数,因为空格是默认分隔符):

> read.table(text="v1 v2 v3 
+    1 5 7 
+    4 2 1#possible error", header=TRUE)
  v1 v2 v3
1  1  5  7
2  4  2  1