преобразование обычного текста во фрейм данных с помощью dplyr в r - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь использовать r, чтобы преобразовать обычный текст, скопированный из pdf с pdftools и tidyverse, во фрейм данных. Я надеюсь на решение с использованием пакетов Tidyverse. Я использовал следующий код, чтобы получить список строк с моей важной информацией:

library(tidyverse)
library(pdftools)

textdf <- pdf_text("raw pdf.pdf")

all_stats_lines <- textdf[3:28]%>%
  str_squish()%>%
  str_replace_all(",", "")%>%
  str_remove_all("\\+80% \\+80% \\+80% \\+40% \\+40% \\+40% Baseline Baseline Baseline \\-40% \\-40% 
  \\-40% \\-80% \\-80% \\-80% Sun Feb 16 Sun Mar 8 Sun Mar 29 Sun Feb 16 Sun Mar 8 Sun Mar 29 Sun Feb 
  16 Sun Mar 8 Sun Mar 29")%>% 
  str_remove_all("compared to baseline")%>%
  strsplit("   ")



В результате получается следующий список из 26 списков строк в следующем формате:


[[1]]
[1] "Alaska Variable 1 Variable 2 Variable 3 42  15  5" 
[2] "Variable 4 Variable 5 Variable 6 43  30  11"              
[3] "Alabama Variable 1 Variable 2 Variable 3 27  9  79"
[4] "Variable 4  Variable 5 Variable 6 20  23  4  "          

[[2]]
[1] "Arizona Variable 1 Variable 2 Variable 3 40  17  7" 
[2] "Variable 4 Variable 5 Variable 6 41  33  10"              
[3] "Arkansas Variable 1 Variable 2 Variable 3 29  7  81"
[4] "Variable 4  Variable 5 Variable 6 22  27  7  "   

... etc.

Запишите имена состояний в начале строк 1 и 3 подсписка и пробелы в именах переменных. Каждое состояние должно быть один ряд. Должно быть 6 столбцов Переменная 1 Переменная 2 Переменная 3 Переменная 4 Переменная 5 Переменная 6 Переменная 6 с соответствующими значениями по порядку.

Любое решение о том, как построить эту таблицу?

1 Ответ

0 голосов
/ 06 апреля 2020

У вас есть несколько проблем, которые вам нужно решить, чтобы сделать это.

  1. разбиение текста на столбцы
  2. объединение пар строк
  3. объединение списков

Если вы собираетесь сделать это только один раз, вероятно, было бы проще скопировать ваши данные в Excel, отформатировать их там, а затем загрузить в R. Но если вы намерены использовать R, то мы необходимо проработать каждый из них в следующем порядке:

1) Текст в столбцы

strsplit(string, " ") разбит текстовые строки на пробелы. strsplit(string, "[[:space:]]+") будет разбит на пробел, рассматривая последовательный пробел как один сплит. Однако вы хотите избежать разделения «Переменная 1» на «Переменная» и «1», а также «Северная Дакота» на «Северная» и «Дакота»

Быстрое решение здесь - gsub("North ", "North_", string), которое превратится в «Северная Дакота» в «Северная Дакота», поэтому два слова остаются вместе, когда вы применяете strsplit.

2) Объединение пар строк

Вы можете использовать модуль для извлечения каждой второй записи вектор: 1:4 %% 2 вернет c(1,0,1,0). Это можно использовать для извлечения каждого второго значения следующим образом: vec[1:4 %% 2 == 1].

Комбинируя их попарно, вы получите что-то вроде следующего:

vec = c('a', 'b', 'c', 'd')
paste(vec[1:4 %% 2 == 1], vec[1:4 %% 2 == 0])

3) Объединение списков

Самое простое решение здесь, вероятно, unlist. Но вы также можете использовать функцию reduce в пакете purrr.

Объединение всего этого

data = unlist(data)
data = trimws(data)
nn = length(data)
data = paste(data[1:nn %% 2 == 1], data[1:nn %% 2 == 0])

# add other rules here for state names that are two words
data = gsub("ariable ", "ariable_", data)
data = gsub("North ", "North_", data)

data %>%
  strsplit("[[:space:]]+") %>%
  purrr::reduce(rbind) %>%
  as.data.frame()
...