6

我想将元数据作为评论添加到我的电子表格中,然后让 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)也没有效果。

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

谢谢,

安德鲁

4

2 回答 2

6

从文档(?read.table):

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

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

请注意,它说的是使用"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
于 2012-10-07T18:55:38.890 回答
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
于 2012-10-07T21:33:10.357 回答