我有一个程序的原始文本输出,我想转换成一个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
Run Code Online (Sandbox Code Playgroud)
我能够将数据读入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
Run Code Online (Sandbox Code Playgroud)
我应该使用什么正则表达式来实现这一目标?我知道,这是理想的应用组合regexec()和regmatches().但是我无法想出一个将行分成所需组件的表达式.
这是一个简单的解决方案:
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
Run Code Online (Sandbox Code Playgroud)
正则表达式" {2,}|(?<=\\d)(?=[A-Z])"由两部分组成,与"|"(逻辑或)结合.
" {2,}"意味着至少两个空格.这将仅在不同的列之间拆分,因为第三列中的文本具有单个空格."(?<=\\d)(?=[A-Z])"表示以数字开头,后跟大写字母的位置.这用于在第二列和第三列之间进行拆分.