我想将元数据添加到我的电子表格中作为评论,然后让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)
也没有效果。
我之后可以删除该列,但由于这似乎是一种常见的做法,我想学习如何正确地做到这一点。
谢谢,
安德鲁
答案 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