【问题标题】:Read tab seperated data set with errors读取有错误的制表符分隔数据集
【发布时间】:2018-10-26 18:44:06
【问题描述】:

我对一些包含制表符分隔数据的数据集有一点问题,但不幸的是原始数据中有一些错误,导致读取 R 时出现问题。

一个更好理解的小例子,数据集如下所示:

Col1 Col2 Col3

1 2 3

4 5 6

7

8 9

10 11 12

7 8 9 部分应该在一行中,但被错误地分成了两部分(在原始数据中)。在读入而不是通过手动更改时是否有机会纠正此问题?由于数据集大约有 400 万个观测值,因此手动校正将花费大量时间...

【问题讨论】:

  • 您在表格中使用什么类型的分隔符?像上面这样的一行是否有 2 个分隔符而不是一个?
  • 您可能希望使用 sed 替换冗余分隔符
  • 你也有空行吗?
  • 不,没有空行

标签: r csv import


【解决方案1】:

试试这个例子:

# read the file line by line:
x <- readLines("data.txt")

# Split by " " (or in your case "\t"), and convert to dataframe with 3 columns:
res <- data.frame(matrix(unlist(strsplit(x[-1], " "), recursive = TRUE),
                         ncol = 3, byrow = TRUE))

# Add column names to dataframe:
colnames(res) <- unlist(strsplit(x[1], " "))

res
#   Col1 Col2 Col3
# 1    1    2    3
# 2    4    5    6
# 3    7    8    9
# 4   10   11   12

示例 data.txt 文件:

Col1 Col2 Col3
1 2 3
4 5 6
7
8 9
10 11 12

注意:刚刚注意到你的真实数据是 400 万行,也许这不是最有效的方法。

【讨论】:

    【解决方案2】:

    我的解决方案比user zx8754 的解决方案更复杂,但它就是这样。

    readWrong <- function(file, skip = 1){
      txt <- readLines(file)
      header <- txt[seq_len(skip)]
      header <- scan(what = character(), textConnection(header))
      txt <- txt[-seq_len(skip)]
      data <- scan(textConnection(txt))
      data <- matrix(data, ncol = length(header), byrow = TRUE)
      data <- as.data.frame(data)
      names(data) <- header
      data
    }
    
    
    readWrong("data.txt")
    #  Col1 Col2 Col3
    #1    1    2    3
    #2    4    5    6
    #3    7    8    9
    #4   10   11   12
    

    【讨论】:

    • 非常感谢这个解决方案,效果很好
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2016-04-22
    • 2012-12-01
    • 2014-08-26
    • 2015-12-03
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多