我有一个程序的原始文本输出,我想将其转换为DataFrame
。文本文件未格式化,如下所示。
10037 149439Special Event 11538.00 13542.59 2004.59
10070 10071Weekday 8234.00 9244.87 1010.87
10216 13463Weekend 145.00 0 -145.00
我可以使用基础包中的R
将数据读入readLines()
。如何将其转换为看起来像这样的数据(列名可以是任何东西)。
A B C D E F
10037 149439 Special Event 11538.00 13542.59 2004.59
10070 10071 Weekday 8234.00 9244.87 1010.87
10216 13463 Weekend 145.00 0 -145.00
我应该使用什么正则表达式来实现这一目标?我知道这非常适合应用regexec()
和regmatches()
的组合。但是我无法想出一个将该行分成所需组件的表达式。
答案 0 :(得分:5)
这是一个简单的解决方案:
raw <- readLines("filename.txt")
data.frame(do.call(rbind, strsplit(raw, " {2,}|(?<=\\d)(?=[A-Z])", perl = TRUE)))
# X1 X2 X3 X4 X5 X6
# 1 10037 149439 Special Event 11538.00 13542.59 2004.59
# 2 10070 10071 Weekday 8234.00 9244.87 1010.87
# 3 10216 13463 Weekend 145.00 0 -145.00
正则表达式" {2,}|(?<=\\d)(?=[A-Z])"
由两部分组成,与"|"
(逻辑或)相结合。
" {2,}"
表示至少有两个空格。这将仅在不同列之间拆分,因为第三列中的文本只有一个空格。"(?<=\\d)(?=[A-Z])"
表示以数字开头,后跟大写字母的位置。这用于在第二列和第三列之间进行拆分。答案 1 :(得分:3)
我从您的数据中创建了"txt.txt"
。然后我们用正则表达式来处理。
> read <- readLines("txt.txt")
> S <- strsplit(read, "[A-Za-z]|\\s")
> W <- do.call(rbind, lapply(S, function(x) x[nzchar(x)]))
> D <- data.frame(W[,1:2], col, W[,3:5])
> names(D) <- LETTERS[seq(D)]
> D
## A B C D E F
## 1 10037 149439 SpecialEvent 11538.00 13542.59 2004.59
## 2 10070 10071 Weekday 8234.00 9244.87 1010.87
## 3 10216 13463 Weekend 145.00 0 -145.00
将所有内容折叠成一些大括号,您就可以自己解析文件了。
PS :如果&#34;特殊&#34;之间的空格和&#34;事件&#34;很重要,请评论,我会修改。
答案 2 :(得分:0)
Something like this至少适合你的榜样,但我不知道你所有的角落......
([0-9]+) +([0-9]+)(.+) ([0-9.-]+) +([0-9.-]+) +([0-9.-]+)
从1到6的捕获组是分别。你的专栏从A到F.