嗯,这是一种有趣的数据格式——而且是有趣的行为。帮助页面显示“查看对引号中嵌入引号的行为的扫描”,但我在该帮助页面中没有看到任何有用的信息,因此我尝试了一些方法。
我相信 quote 参数所做的是告诉 R 忽略引号之间出现的任何 sep 元素,并删除任何 quote 元素(因为这意味着仅用于分隔列,而不是作为数据)。因此,这仅适用于您,因为您在 words 列中的第二个引号之后没有任何逗号。
这里有四个例子。
引号中没有逗号(您的示例)
name,words,name
John, "He says:"I love it!"", 18
有趣的是,这个例子在你的代码的两个版本中都适用于我。第一个保留所有引号,第二个删除它们。
read.table("data.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
## name words name.1
## 1 John "He says:"I love it!"" 18
read.table("data.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
## name words name.1
## 1 John He says:I love it! 18
第一个引号后的逗号
name,words,name
John, "He says, "I love it!"", 18
这里的第一个版本 (quote="") 根据逗号将行分成四列,而不是三列,并使用额外的列作为行名。第二个版本忽略了添加的逗号,但也删除了实际引号周围的引号。
read.table("text.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
## name words name.1
## John "He says "I love it!"" 18
read.table("text.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
## name words name.1
## 1 John He says, I love it! 18
第二个引号后的逗号
name,words,name
John, "He says: "I love it, do you?"", 18
这两个版本的作用几乎相同(四列),因为逗号不在成对的引号之间。第一个保留引号,第二个不保留。
read.table("text.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
## name words name.1
## John "He says: "I love it do you?"" 18
read.table("text.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
## name words name.1
## John He says: I love it do you? 18
两个引号之间的逗号
name,words,name
John, "He says, "I love it, do you?"", 18
这里第一个不起作用,因为它在第一行找到三个列名但有五个列。第二个跳过第一个逗号,但不跳过第二个,因此再次将其分成四列,并使用额外的作为行名。
read.table("text.csv", header = TRUE, sep = ',', quote = "", stringsAsFactors = FALSE)
## Error in read.table("text.csv", header = TRUE, sep = ",", quote = "", :
## more columns than column names
read.table("text.csv", header = TRUE, sep = ',', quote = "\"", stringsAsFactors = FALSE)
## name words name.1
## John He says, I love it do you? 18
最后,所有这些例子都只有一行;如果你有不止一行并且它们解析成不同数量的列,你会得到一个与你得到的错误类似的错误,除了第一行的列数不同。
您的错误让我感到惊讶的是,它发生在第 1 行;如果 R 认为您在该行中的列少于三列(它在标题行中找到的数字),您会收到此错误,但在我的系统上,无论如何,它会在该行中找到三个元素。