Чтение группировок в текстовом файле в R - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть текстовый файл со многими сгруппированными разделами, как показано ниже (очевидно, разные цифры в каждой группе). Я хочу взять все столбцы X, Y и Z в каждой группе и поместить их в информационный кадр. Как я мог это сделать? Я также хочу добавить столбец индикатора, чтобы определить, из какой группы были получены строки.

Вот базовый c макет того, как выглядит текстовый файл ...

Start Date:                 02/05/2020
Start Time:                 16:00:14

  Time         X     Y     Z
============   ===== ===== =====
000:00:00.05    3.50  9.00  8.50
000:00:00.10    3.50  8.50  9.00
000:00:00.15    5.00  8.00  9.50
000:00:00.20    5.00  9.00  8.50
000:00:00.25    5.00  9.00  6.50
000:00:00.30    3.50  9.50  7.00


Start Date:                 02/05/2020
Start Time:                 16:00:14

  Time         X     Y     Z
============   ===== ===== =====
000:00:00.05    3.50  9.00  8.50
000:00:00.10    3.50  8.50  9.00
000:00:00.15    5.00  8.00  9.50
000:00:00.20    5.00  9.00  8.50
000:00:00.25    5.00  9.00  6.50
000:00:00.30    3.50  9.50  7.00


Start Date:                 02/05/2020
Start Time:                 16:00:14

  Time         X     Y     Z
============   ===== ===== =====
000:00:00.05    3.50  9.00  8.50
000:00:00.10    3.50  8.50  9.00
000:00:00.15    5.00  8.00  9.50
000:00:00.20    5.00  9.00  8.50
000:00:00.25    5.00  9.00  6.50
000:00:00.30    3.50  9.50  7.00

I пытался использовать этот код, но смог получить только первую строку каждой группировки ...

export <- list.files(path=wd, pattern = "one.Export")
options(warn=-1)
dat <- readLines(export)
x_dat <- read.table(text = dat[grep("Start Time:", dat) + 4])[,2:4]

Если я добавлю длины строк, я получу обратно NA ...

x_dat <- read.table(text = dat[grep("Start Time:", dat) + 4])[1:5,2:4]

Есть предложения?

1 Ответ

0 голосов
/ 24 февраля 2020

Проблема с этим типом синтаксического анализа заключается в том, что нужно полагаться на текст в точном формате, указанном в вопросе.

Это будет работать для вашего примера, но, вероятно, придется изменено для ваших собственных реальных данных:

library(tidyverse)

  readLines("~/data.txt")  %>%          # Read file into a vector of strings
  paste(collapse = "\n") %>%            # Stick them together with newlines
  strsplit("Start Date: +") %>%         # Split them into groups at the keyword
  unlist %>%                            
  `[`(-1) %>%    # Remove the empty first element
  lapply(function(x) unlist(strsplit(x, "\n"))) %>%         # carve at line breaks
  lapply(function(x) grep("\\d", x, value = TRUE)) %>%      # keep only rows with numbers
  lapply(function(x) strsplit(x, " +")) %>%                 # carve at spaces
  lapply(function(x) cbind(rep(paste(x[[1]], x[[2]][3]), length(x) - 2),
                           do.call(rbind, x[-c(1:2)]))) %>% # Bind into rows and add labels
  {do.call(rbind, .)} %>%                                   # Stick groups together
  as.data.frame() %>%
  setNames(c("Group_date", "Time", "X", "Y", "Z"))          # Make dataframe and name it
#>             Group_date         Time    X    Y    Z
#> 1  02/05/2020 16:00:14 000:00:00.05 3.50 9.00 8.50
#> 2  02/05/2020 16:00:14 000:00:00.10 3.50 8.50 9.00
#> 3  02/05/2020 16:00:14 000:00:00.15 5.00 8.00 9.50
#> 4  02/05/2020 16:00:14 000:00:00.20 5.00 9.00 8.50
#> 5  02/05/2020 16:00:14 000:00:00.25 5.00 9.00 6.50
#> 6  02/05/2020 16:00:14 000:00:00.30 3.50 9.50 7.00
#> 7  02/05/2020 16:00:14 000:00:00.05 3.50 9.00 8.50
#> 8  02/05/2020 16:00:14 000:00:00.10 3.50 8.50 9.00
#> 9  02/05/2020 16:00:14 000:00:00.15 5.00 8.00 9.50
#> 10 02/05/2020 16:00:14 000:00:00.20 5.00 9.00 8.50
#> 11 02/05/2020 16:00:14 000:00:00.25 5.00 9.00 6.50
#> 12 02/05/2020 16:00:14 000:00:00.30 3.50 9.50 7.00
#> 13 02/05/2020 16:00:14 000:00:00.05 3.50 9.00 8.50
#> 14 02/05/2020 16:00:14 000:00:00.10 3.50 8.50 9.00
#> 15 02/05/2020 16:00:14 000:00:00.15 5.00 8.00 9.50
#> 16 02/05/2020 16:00:14 000:00:00.20 5.00 9.00 8.50
#> 17 02/05/2020 16:00:14 000:00:00.25 5.00 9.00 6.50
#> 18 02/05/2020 16:00:14 000:00:00.30 3.50 9.50 7.00

Создано в 2020-02-24 пакетом представлений (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...