读取文件 - 警告信息

8

我有一个文件,它有22268行乘以2521列。当我尝试使用以下代码读取文件时:

file <- read.table(textfile, skip=2, header=TRUE, sep="\t", fill=TRUE, blank.lines.skip=FALSE)

但我只读取了13024行和2521列,并出现了以下错误:

警告信息:在扫描文件时,读取的数据项数量不是列数的整数倍。

我也使用了以下命令来查看哪些行的列数不正确:

x <-count.fields(textfile, sep="\t", skip=2)
incorrect <- which(x != 2521)

我得到了大约20行错误的列表。

有没有一种方法可以使用NA值填充这些行?

我认为这就是read.table函数中“fill”参数的作用,但事实并非如此。

或者说,有没有一种方法可以忽略那些在“incorrect”变量中被识别出来的行?


2
检查不必要的引号和注释字符... - Ben Bolker
1
标题中不需要使用 R,因为 r 标签已经表明了这一点。 - mnel
有没有办法避免读取“不正确”中列出的行? - Sheila
@Sheila,如果目标是要有一个只包含正确行的数据框,你仍然可以将错误行读入到一个临时变量中,然后从临时变量中仅读取“正确”行。 - Ricardo Saporta
大家好。我已经解决了这个问题。在获取了“不正确”行的数量之后,我创建了一个名为“allRows”的向量,它从1到22268(包括标题)范围内,并通过删除任何“不正确”的行索引来找到我想要读取的行。然后,我能够使用R.utils库中的readTable函数来读取我实际想要的行。感谢大家的帮助。 - Sheila
1个回答

5
你可以使用readLines()来输入数据,然后找到有问题的行。
    con <- file("path/to/file.csv", "rb")
    rawContent <- readLines(con) # empty
    close(con)  # close the connection to the file, to keep things tidy

请查看rawContent

要查找列数不正确的行,例如:

    expectedColumns <- 2521
    delim <- "\t"

    indxToOffenders <-
    sapply(rawContent, function(x)   # for each line in rawContent
        length(gregexpr(delim, x)[[1]]) != expectedColumns   # count the number of delims and compare that number to expectedColumns
    ) 

然后读取您的数据:
  myDataFrame <- read.csv(rawContent[-indxToOffenders], header=??, sep=delim)

嗨@Ricardo - 你有建议使用特定的库吗?在你上面的例子中,你输入了“library”,然后是“expectedColumns <- 2521”等等... - Sheila
嗨@Sheila,我原本打算建议使用stringr代替正则表达式,但没有必要。 - Ricardo Saporta
嗨@Ricardo,只是为了明确,indxToOffenders也应该被赋值,对吗?所以我们会看到“indxToOffenders <- sapply....”? - Sheila
嗨@Ricardo。在我上面的代码中,变量“incorrect”具有没有所有2521行的行的索引。有没有避免读入这些行的方法? - Sheila
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/20595/discussion-between-sheila-and-ricardo-saporta - Sheila
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接