【发布时间】: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
【问题讨论】: