Grep текст и положить в фрейм данных - PullRequest
2 голосов
/ 19 апреля 2019

В результате использования функции checkresiduals() из пакета forecast я получил такой результат:

#Result of checkresiduals() function
test <- "Q* = 4.5113, df = 4.6, p-value = 0.4237"

Теперь я собираюсь разбить эту строку текста с помощью grep() или других функций на data.frame (с тремя столбцами Q*, df, p-value), как в примере ниже:

    Q*         df       p-value
    4.5113     4.6      0.4237

Может кто-нибудь помочь мне с этим кодом?

Ответы [ 3 ]

3 голосов
/ 19 апреля 2019

Вы можете использовать strsplit.

tmp <- do.call(cbind, strsplit(strsplit(test, ", ")[[1]], " = "))
d <- setNames(data.frame(t(as.numeric(tmp[2, ]))), tmp[1, ])
#       Q*  df p-value
# 1 4.5113 4.6  0.4237
2 голосов
/ 19 апреля 2019

Вот один способ с tidyverse

library(tidyverse)
tibble(test) %>% 
    separate_rows(test, sep = ",\\s*") %>% 
    separate(test, into = c("v1", 'v2'), sep= " = ") %>% 
    deframe %>%
    as.list %>% 
    as_tibble
# A tibble: 1 x 3
#  `Q*`   df    `p-value`
#  <chr>  <chr> <chr>    
#1 4.5113 4.6   0.4237   

Кроме того, он может быть изменен в JSON и легко читать его с помощью jsonlite

library(jsonlite)
data.frame(fromJSON(paste0("{", gsub('([^0-9, ]+)(?: \\=)', '"\\1":', 
               test), "}")), check.names = FALSE) 
#       Q*  df p-value
#1 4.5113 4.6  0.4237
1 голос
/ 19 апреля 2019

Вот два альтернативных подхода:

  1. Преобразование строки в формат DCF и использование read.dcf()
  2. «Вычисления на языке»: преобразовать строку в правильное выражение R и использовать parse() / eval()

read.dcf()

Используйте функцию read.dcf() после преобразования строки test в формат DCF (файл управления Debian).
(Кстати, файл DESCRIPTION каждого пакета R представлен в формате DCF.)

library(magrittr) # piping used for readability
test %>% 
  stringr::str_replace_all("=", ":") %>%        # replace "=" by ":"
  stringr::str_replace_all(",\\s*", "\n") %>%   # replace ", " by line break
  textConnection() %>% 
  read.dcf(all = TRUE)
     Q*  df  p-value 
1 4.5113 4.6   0.4237

Все столбцы имеют тип символов.

Вычисления на языке

library(magrittr) # piping used for readability
test %>%   
  stringr::str_replace_all("(\\S+) =", "`\\1` =") %>% 
  paste0("data.frame(", ., ", check.names = FALSE)") %>% 
  parse(text = .) %>% 
  eval()
      Q*  df p-value
1 4.5113 4.6  0.4237

Все столбцы имеют тип double.

test %>%   
  stringr::str_replace_all("(\\S+) =", "`\\1` =") %>%   
  paste0("data.frame(", ., ", check.names = FALSE)")

возврат

"data.frame(`Q*` = 4.5113, `df` = 4.6, `p-value` = 0.4237, check.names = FALSE)"

, который затем анализируется в выражении и обрабатывается.

Обратите внимание, что все имена переменных заключаются в кавычки для обработки синтаксически неверных имен переменных, таких как Q* и p-value.

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