在 R 中读取具有不同宽度和多个 headers 的行

Read rows with different Width and several headers in R

我有以下日志需要在 R 中阅读

MO                RSITE                               COMB  FHOP  MODEL
RXOTG-0           3BFR42                              HYB   SY    G12

                  SWVERREPL      SWVERDLD       SWVERACT      TMODE
                                 B1312R078G     B1312R078G    SCM

MO                RSITE                               COMB  FHOP  MODEL
RXOTG-1           3BFR42                              HYB   SY    G12

                  SWVERREPL      SWVERDLD       SWVERACT      TMODE
                                 B1312R078G     B1312R078G    SCM

我需要这样阅读

MO      RSITE   COMB    FHOP    MODEL   SWVERREPL   SWVERDLD    SWVERACT    TMODE
RXOTG-0 3BFR42  HYB     SY      G12                 B1312R078G  B1312R078G  SCM
RXOTG-1 3BFR42  HYB     SY      G12                 B1312R078G  B1312R078G  SCM

我不能使用 read.fwf,因为每一行的宽度都不同,而且每一行都有一个 header。我能阅读的唯一方法是使用 read.table sep = " " 并且经过大量转换后我得到了想要的输出。

有人有什么减少编码阅读的建议吗?

您可以通过使用 readLines 然后提取行,将它们粘贴在一起并使用 read.table 中的 text 参数导入数据来获得一些方法。

f <- readLines("myFile.txt")
header  <- paste(f[1], f[3])
body <- sapply(seq(1, length(f), 6), function(i) paste(f[i+1], f[i+4]))

read.table(header = FALSE, text = paste(body, collapse = "\n"))

这将省略空白列。如果您需要这个,或者不同的列是空白的,请改用 read.fwf

这将读取您的示例,但如果任何条目未加引号嵌入白色,则会失败 space:

data.frame( scan(text=txt, 
                 what=list( MO="", RSITE="", COMB="",  FHOP="", 
                            MODEL="", SWVERREPL="",   SWVERDLD="", 
                            SWVERACT ="",   TMODE=""), 
                 multi.line=TRUE))[c(TRUE, FALSE), ] # removes extraneous extra "headers"
#--------------
Read 4 records
  MO RSITE COMB FHOP MODEL SWVERREPL SWVERDLD SWVERACT TMODE
1 MO RSITE COMB FHOP MODEL   RXOTG-0   3BFR42      HYB    SY
3 MO RSITE COMB FHOP MODEL   RXOTG-1   3BFR42      HYB    SY