在R中解析复杂的文本文件
Parse complex text file in R
我想在 R 中解析一个文本文件以作为 data.frame 加载。我有一个包含固定宽度数据的长文本文件,由节 (ID) 和小节 (SUB) 分隔。每个部分的长度是可变的。我正在寻找创建两个数据框,一个用于 ID 部分,一个用于 SUB 部分。示例数据如下:
Header 1
METRIC 0.30 10.00
ID K0107050 Aa
0.06 15.24 14.40 14.40 7.13 0.13 0.19 1
0.17 14.35 13.57 13.57 6.40 0.12 0.18 1
SUB
1.000 1.000 0.093 0.11 0.11 301
1.000 1.000 0.093 0.11 0.11 61
ID K0129050 Aa
0.06 26.35 24.90 24.90 10.88 0.62 0.88 1
0.15 25.35 23.96 23.96 10.93 0.55 0.74 1
SUB
3.000 3.000 0.506 0.53 0.53 102
4.000 4.000 0.514 0.55 0.55 118
我想要的数据框是:
DF1
Header 1 K0107050 Aa 0.06 15.24 14.40 14.40 7.13 0.13 0.19 1
Header 1 K0107050 Aa 0.17 14.35 13.57 13.57 6.40 0.12 0.18 1
Header 1 K0129050 Aa 0.06 26.35 24.90 24.90 10.88 0.62 0.88 1
Header 1 K0129050 Aa 0.15 25.35 23.96 23.96 10.93 0.55 0.74 1
DF2
Header 1 K0107050 Aa 1.000 1.000 0.093 0.11 0.11 301
Header 1 K0107050 Aa 1.000 1.000 0.093 0.11 0.11 61
Header 1 K0129050 Aa 3.000 3.000 0.506 0.53 0.53 102
Header 1 K0129050 Aa 4.000 4.000 0.514 0.55 0.55 118
到目前为止,我已经使用了 readLines(),但在那之后卡住了,因为文本文件中有不同的部分。
谢谢
这里是开始(抱歉该睡觉了...):
x <- readLines("myFile.txt")
library(dplyr)
bind_rows(
lapply(split(x, cumsum(grepl("Header|Metric|ID|SUB", x))), function(i){
i1 <- i[ i != "" ]
nums <- unlist(strsplit(tail(i1, -1), " "))
res <- cbind.data.frame(Grp = i1[1],
matrix(na.omit(as.numeric(nums)),
nrow = length(i1) - 1, byrow = TRUE),
stringsAsFactors = FALSE)
res
})
)
# Grp 1 2 3 4 5 6 7 8
# 1 Header 1 0.30 10.00 NA NA NA NA NA NA
# 2 ID K0107050 Aa 0.06 15.24 14.400 14.40 7.13 0.13 0.19 1
# 3 ID K0107050 Aa 0.17 14.35 13.570 13.57 6.40 0.12 0.18 1
# 4 SUB 1.00 1.00 0.093 0.11 0.11 301.00 NA NA
# 5 SUB 1.00 1.00 0.093 0.11 0.11 61.00 NA NA
# 6 ID K0129050 Aa 0.06 26.35 24.900 24.90 10.88 0.62 0.88 1
# 7 ID K0129050 Aa 0.15 25.35 23.960 23.96 10.93 0.55 0.74 1
# 8 SUB 3.00 3.00 0.506 0.53 0.53 102.00 NA NA
# 9 SUB 4.00 4.00 0.514 0.55 0.55 118.00 NA NA
我想在 R 中解析一个文本文件以作为 data.frame 加载。我有一个包含固定宽度数据的长文本文件,由节 (ID) 和小节 (SUB) 分隔。每个部分的长度是可变的。我正在寻找创建两个数据框,一个用于 ID 部分,一个用于 SUB 部分。示例数据如下:
Header 1
METRIC 0.30 10.00
ID K0107050 Aa
0.06 15.24 14.40 14.40 7.13 0.13 0.19 1
0.17 14.35 13.57 13.57 6.40 0.12 0.18 1
SUB
1.000 1.000 0.093 0.11 0.11 301
1.000 1.000 0.093 0.11 0.11 61
ID K0129050 Aa
0.06 26.35 24.90 24.90 10.88 0.62 0.88 1
0.15 25.35 23.96 23.96 10.93 0.55 0.74 1
SUB
3.000 3.000 0.506 0.53 0.53 102
4.000 4.000 0.514 0.55 0.55 118
我想要的数据框是:
DF1
Header 1 K0107050 Aa 0.06 15.24 14.40 14.40 7.13 0.13 0.19 1
Header 1 K0107050 Aa 0.17 14.35 13.57 13.57 6.40 0.12 0.18 1
Header 1 K0129050 Aa 0.06 26.35 24.90 24.90 10.88 0.62 0.88 1
Header 1 K0129050 Aa 0.15 25.35 23.96 23.96 10.93 0.55 0.74 1
DF2
Header 1 K0107050 Aa 1.000 1.000 0.093 0.11 0.11 301
Header 1 K0107050 Aa 1.000 1.000 0.093 0.11 0.11 61
Header 1 K0129050 Aa 3.000 3.000 0.506 0.53 0.53 102
Header 1 K0129050 Aa 4.000 4.000 0.514 0.55 0.55 118
到目前为止,我已经使用了 readLines(),但在那之后卡住了,因为文本文件中有不同的部分。 谢谢
这里是开始(抱歉该睡觉了...):
x <- readLines("myFile.txt")
library(dplyr)
bind_rows(
lapply(split(x, cumsum(grepl("Header|Metric|ID|SUB", x))), function(i){
i1 <- i[ i != "" ]
nums <- unlist(strsplit(tail(i1, -1), " "))
res <- cbind.data.frame(Grp = i1[1],
matrix(na.omit(as.numeric(nums)),
nrow = length(i1) - 1, byrow = TRUE),
stringsAsFactors = FALSE)
res
})
)
# Grp 1 2 3 4 5 6 7 8
# 1 Header 1 0.30 10.00 NA NA NA NA NA NA
# 2 ID K0107050 Aa 0.06 15.24 14.400 14.40 7.13 0.13 0.19 1
# 3 ID K0107050 Aa 0.17 14.35 13.570 13.57 6.40 0.12 0.18 1
# 4 SUB 1.00 1.00 0.093 0.11 0.11 301.00 NA NA
# 5 SUB 1.00 1.00 0.093 0.11 0.11 61.00 NA NA
# 6 ID K0129050 Aa 0.06 26.35 24.900 24.90 10.88 0.62 0.88 1
# 7 ID K0129050 Aa 0.15 25.35 23.960 23.96 10.93 0.55 0.74 1
# 8 SUB 3.00 3.00 0.506 0.53 0.53 102.00 NA NA
# 9 SUB 4.00 4.00 0.514 0.55 0.55 118.00 NA NA