【问题标题】:Importing tab delim data into R将制表符分隔数据导入 R
【发布时间】:2021-08-26 17:28:20
【问题描述】:

我正在尝试建立一个可重复的工作流程,用于读取和格式化大量杂乱的制表符分隔的 txt 数据表,但我正在努力寻找能够正确读取数据的函数。

第一行有一个值,随后的行有不同数量的空白单元格,然后是值。 {unpivitR} 将在我读入数据后处理它,但我一生都无法解析超过第一个 col - 最多应该有 150 个或更多,但第一个中的所有空白行导致问题,不幸的是我不能删除第一行。如果我手动(在 excel 中...)将其从 txt 文件转换为 csv 文件,它会完美导入,但理想情况下这不是我想要采取的路线。我通常默认使用 {readr} 函数进行导入,但绝对愿意接受其他建议!

例如:

read_tsv("Name\n
         \t\t\tdet_1\tdet_2\n
         \t\t\t4\t5\n
         10:10\tSS\tXY\t6\t7", col_names = FALSE)

导入为:

# A tibble: 4 x 1
  X1   
  <chr>
1 Name 
2 NA   
3 NA   
4 10:10

带有警告:

警告:3 次解析失败。
行列预期实际文件
2 -- 1 列 5 列文字数据
3 -- 1 列 5 列文字数据
4 -- 1 列 5 列文字数据

理想情况下,它应该如下所示: read_tsv("Name\t\t\t\t\n\t\t\tdet_1\tdet_2\n\t\t\t4\t5\n10:10\tSS\tXY\t6\t7", col_names = FALSE)

# A tibble: 4 x 5
  X1    X2    X3    X4    X5   
  <chr> <chr> <chr> <chr> <chr>
1 Name  NA    NA    NA    NA   
2 NA    NA    NA    det_1 det_2
3 NA    NA    NA    4     5    
4 10:10 SS    XY    6     7  

任何指针或者我只需要点击并手动将其转换为 csvs。我必须通过整个文件列表映射函数,设置略有不同,所以我不能为每个文件编写特定的内容。

更新: 我刚刚意识到我的 reprex 太简单了,无法完全复制问题。数据随机变宽,最高可达 ca。 200 列向下约 200 行(尽管不一致......)。在本例中,“12”应位于第 10 行。

read.delim(text = "Name\n
         \t\tdet_1\t\n
         \t\t\t4\n
         \t\t\t5\n
         \t\t\t6\n
         \t\t\t7\n
         \t\t\t8\n
         \t\t\t9\n
         \t\t\t10\n
         10:10\tSS\tXY\t11\t12", sep = "\t", header = FALSE, fill = TRUE, na.strings = "", strip.white = TRUE)

返回:

      V1   V2    V3 V4
1   Name <NA>  <NA> NA
2   <NA> <NA> det_1 NA
3   <NA> <NA>  <NA>  4
4   <NA> <NA>  <NA>  5
5   <NA> <NA>  <NA>  6
6   <NA> <NA>  <NA>  7
7   <NA> <NA>  <NA>  8
8   <NA> <NA>  <NA>  9
9   <NA> <NA>  <NA> 10
10 10:10   SS    XY 11
11    12 <NA>  <NA> NA

【问题讨论】:

    标签: r readr csv


    【解决方案1】:

    考虑将read.csvbase R 结合使用fill = TRUE

    read.csv(text = "Name\n
             \t\t\tdet_1\tdet_2\n
             \t\t\t4\t5\n
             10:10\tSS\tXY\t6\t7", sep="\t", 
                  header = FALSE, fill = TRUE, na.strings = "",strip.white = TRUE)
    

    -输出

        V1   V2   V3    V4    V5
    1  Name <NA> <NA>  <NA>  <NA>
    2  <NA> <NA> <NA> det_1 det_2
    3  <NA> <NA> <NA>     4     5
    4 10:10   SS   XY     6     7
    

    【讨论】:

    • read.delim ,甚至默认有 fill=TRUE ...但需要 header=FALSE
    • 谢谢两位!这种工作,但它不捕获数据的全部宽度。抱歉,我的代表没有达到标准,所以我用一个新的例子更新了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2013-05-22
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多