【发布时间】:2021-04-12 14:24:06
【问题描述】:
问题
我正在尝试想出一种简洁/快速的方法来将由换行符 (\n) 分隔的文件读入多个列。
基本上在给定的输入文件中,输入文件中的多行应该成为输出中的单行,但是大多数文件读取函数会明智地将换行符解释为表示新行,因此它们最终会成为数据框单列。这是一个例子:
输入文件如下所示:
Header Info
2021-01-01
text
...
@
2021-01-02
text
...
@
...
... 表示输入文件中可能存在的多行,@ 表示输出数据帧中一行的真正结尾。所以在读取这个文件时,它应该变成这样的数据框(忽略标题):
| X1 | X2 | ... | Xn |
|---|---|---|---|
| 2021-01-01 | text | ... | ... |
| 2021-01-02 | text | ... | ... |
| ... | ... | ... | ... |
我的尝试
我尝试过base、data.table、readr 和vroom,它们都有两个输出之一,要么是具有单列的数据框,要么是向量。我想避免 for 循环,因此我当前的解决方案是使用 base::readLines() 将其读取为字符向量,然后手动添加一些“正确”的列分隔符(例如 ;),然后再次加入和拆分。
# Save the example data to use as input
writeLines(c("Header Info", "2021-01-01", "text", "@", "2021-01-02", "text", "@"), "input.txt")
input <- readLines("input.txt")
input <- paste(input[2:length(input)], collapse = ";") # Skip the header
input <- gsub(";@;*", replacement = "\n", x = input)
input <- strsplit(unlist(strsplit(input, "\n")), ";")
input <- do.call(rbind.data.frame, input)
# Clean up the example input
unlink("input.txt")
我上面的代码有效并给出了预期的结果,但肯定有更好的方法吗? 编辑:这是函数内部的,因此任何简化的部分(可能是较大部分)目的是提高速度。
提前致谢!
【问题讨论】:
-
如果您正在寻找一种快速的方法来做到这一点,我建议在 unix 操作系统上使用
grep或sed之类的东西,将所有 \n 替换为一些分隔符,然后将 @ 替换为 \n .然后读入数据。否则,R 包 stringi 对于字符串操作非常快。也就是说,我不知道有什么包可以让你用换行符分割。 -
为了替换你最后的步骤,大多数数据读取函数都将向量作为输入,即
fread("hello,world\n1,2")与readr::read_csv("hello,world\n1,2")一样工作
标签: r data.table readr