R 删除逗号分隔文件中列数超过一定数量的行

R 删除逗号分隔文件中列数超过一定数量的行,r,R,我在逗号分隔的文件中有行/观察值,理想情况下应该有55列。但有些字段(如地址)中有一个额外的逗号。例如曼哈顿,纽约应该是一个字段曼哈顿,纽约,但是当我阅读文件时,我得到了两个字段曼哈顿和纽约,这增加了列数 我是否可以使用R或任何工具(如定界或Excel)删除这些观察结果 我最终想把这个文件加载到R中进行分析 我同意我的问题与类似,但我正在R中寻找解决方案 输入 Name, Address, DOB John, Manhattan, New York, 2/8/1990 Jacob, Arizon

我在逗号分隔的文件中有行/观察值,理想情况下应该有55列。但有些字段(如地址)中有一个额外的逗号。例如曼哈顿,纽约应该是一个字段曼哈顿,纽约,但是当我阅读文件时,我得到了两个字段曼哈顿纽约,这增加了列数

我是否可以使用R或任何工具(如定界或Excel)删除这些观察结果

我最终想把这个文件加载到R中进行分析

我同意我的问题与类似,但我正在R中寻找解决方案

输入

Name, Address, DOB
John, Manhattan, New York, 2/8/1990
Jacob, Arizona, 9/10/2012
Smith, New Jersey, 8/10/2016
Name, Address, DOB
Jacob, Arizona, 9/10/2012
Smith, New Jersey, 8/10/2016
预期产出

Name, Address, DOB
John, Manhattan, New York, 2/8/1990
Jacob, Arizona, 9/10/2012
Smith, New Jersey, 8/10/2016
Name, Address, DOB
Jacob, Arizona, 9/10/2012
Smith, New Jersey, 8/10/2016

一种选择是使用
readLines
读取数据,然后使用
sub
在单词周围创建引号,然后使用
read.table
读取数据集

lines1 <- gsub(",", " ", lines)
lines1[-1] <- sub("^(\\S+)\\s+([^0-9]+\\b)\\s+(\\d+.*)", "\\1 '\\2' \\3", 
                              lines1[-1])

read.table(text=lines1,  stringsAsFactors=FALSE, header = TRUE)
#   Name             Address       DOB
#1  John Manhattan  New York  2/8/1990
#2 Jacob             Arizona 9/10/2012
#3 Smith          New Jersey 8/10/2016

lines1我们可以计算每行中的逗号数,并仅为具有预期逗号数的行子集行向量:

## read in raw file lines using readLines()
lines1 <- readLines(textConnection('Name, Address, DOB\nJohn, Manhattan, New York, 2/8/1990\nJacob, Arizona, 9/10/2012\nSmith, New Jersey, 8/10/2016\n'));

## subset for lines with the expected number of commas
lines2 <- lines1[2L==sapply(lines1,function(s) nchar(s)-nchar(gsub(',','',s)))];

## result
lines1;
## [1] "Name, Address, DOB"
## [2] "John, Manhattan, New York, 2/8/1990"
## [3] "Jacob, Arizona, 9/10/2012"
## [4] "Smith, New Jersey, 8/10/2016"
## [5] ""
lines2;
## [1] "Name, Address, DOB"
## [2] "Jacob, Arizona, 9/10/2012"
## [3] "Smith, New Jersey, 8/10/2016"
##使用readLines()读取原始文件行

行1一般来说,我不主张做你想做的事,也就是扔掉记录。尽管如此,如果这是您想要做的,您可以按如下方式做

假设您的数据以文本形式存储在名为
foo
的文件中,您可以使用
count.fields
函数对存在
sep
时定义的字段进行计数。然后从
readLines
函数中省略它们

text <-
"Name, Address, DOB
John, Manhattan, New York, 2/8/1990
Jacob, Arizona, 9/10/2012
Smith, New Jersey, 8/10/2016
"
cat(text, file = "foo", sep = ",")
fields <- count.fields("foo", sep = ",")
readLines("foo")[fields == 3]

文本请显示一个小的可复制示例数据集和预期输出使用逗号分隔的文件首先想到的是数据中有逗号,而没有引用每列中的数据,如
“John”、“纽约曼哈顿”、“2/8/1990”
。如果您可以控制输入文件的创建方式,则可以引用数据,就像通常使用csv文件那样。或者,当数据中有逗号时,您可以使用制表符分隔的文件。是否可以将正则表达式分解为
package:rex
terms?@rpierce我从未使用过package rex,因此不确定它是如何工作的。单击“提交”时,我没有看到这一点。这是一个聪明的解决方案,不知道
count.fields
函数。我甚至不知道
count.fields()
函数!非常有用,+1对你来说在这种情况下你会提倡做什么?有没有办法在地址列下包含正确的地址值?我想出了如何把它转换成数据帧。谢谢。在这个简单的例子中,我们将提取第一个单词和第一个数字之间的所有单词,并将它们粘贴在一起。