Мне интересно, есть ли у кого-нибудь советы / приемы о том, как обрабатывать преобразование данных, например, что показано ниже:
library(tidyverse)
example.list = list(" 1 North Carolina State University at Raleigh 15 9 12 13 22 15 32 19 14 20 12 17 19 20 19 25 283",
" 2 Iowa State University 9 8 5 11 14 4 11 13 14 9 15 28 14 9 18 27 209",
" 3 University of Wisconsin-Madison 5 6 14 9 20 13 15 12 13 9 13 10 13 24 15 17 208",
" 4 Stanford University* 10 12 14 6 9 10 5 9 13 7 13 10 4 9 23 6 160",
" 5 Texas A & M University-College Station 6 12 18 10 7 4 5 11 16 18 10 7 15 4 8 8 159",
" 9 University of Michigan-Ann Arbor 8 5 3 3 8 9 12 11 7 11 13 9 8 11 13 9 140",
"10 University of California-Los Angeles 2 2 2 6 9 7 9 8 7 11 11 8 6 12 13 10 123",
"19 Rice University 3 3 5 11 4 7 7 11 2 6 4 6 3 8 7 7 94")
В что-то вроде вывода здесь:
example.list %>%
substring(3) %>%
str_replace_all("[^[:alnum:]]", " ") %>%
str_squish() %>%
strsplit(split = "(?<=[a-zA-Z])\\s*(?=[0-9])", perl = TRUE) %>%
unlist() %>%
matrix(ncol = 2, byrow = TRUE) %>%
data.frame() %>%
separate("X2",into = paste0("X",2:18),sep = " ")
Общий шаблон, который необходимо извлечь, - это все символы в его собственном столбце до первых чисел, а все остальные столбцы разделены пробелами на другие столбцы.
Интересно, можно ли сделать большую часть этого в одном шаблоне регулярного выражения или вообще без него.
Я просто хочу улучшить обработку строк, так как я мало работал с этим! Вариант использования здесь был бы похож на попытку вытащить табличные данные из pdf / html в data.frame.
Edit:
Я ценю все советы и разные точки зрения!
Я понял, что на самом деле пропустил несколько заслуживающих упоминания тестовых примеров:
example2.list = list(" 2 Iowa State University 9 8 5 11 14 4 11 13 14 9 15 28 14 9 18 27 209",
" 3 University of Wisconsin-Madison 5 6 14 9 20 13 15 12 13 9 13 10 13 24 15 17 208",
" 4 Stanford University* 10 12 14 6 9 10 5 9 13 7 13 10 4 9 23 6 160",
" 5 Texas A & M University-College Station 6 12 18 10 7 4 5 11 16 18 10 7 15 4 8 8 159",
" 9 University of Michigan-Ann Arbor 8 5 3 3 8 9 12 11 7 11 13 9 8 11 13 9 140",
"10 University of California-Los Angeles 2 2 2 6 9 7 9 8 7 11 11 8 6 12 13 10 123",
"19 Rice University 3 3 5 11 4 7 7 11 2 6 4 6 3 8 7 7 94",
"52 Bowling Green State University 0 0 0 0 0 1 5 2 2 2 4 7 3 4 4 3 37",
"55 University of New Mexico 4 2 3 1 3 0 5 3 2 1 1 2 3 2 3 0 35")
На самом деле это не так аккуратно, как выровнено.
Полный набор данных , слегка почистил:
library(pdftools)
library(tidyverse)
data.loc = "https://ww2.amstat.org/misc/StatsPhD2003-MostRecent.pdf"
data.full =
pdf_text(data.loc) %>%
read_lines() %>%
head(-2) %>%
tail(-3) %>%
lapply(function(ele) if(ele == "") NULL else ele) %>%
compact()
Вот и была моя вторая попытка:
library(tidyverse)
library(magrittr)
# Ignores column names
data.full[-1] %>%
# Removing excess whitepace
str_squish() %>%
# Removes index
str_remove("^\\s*\\d*\\s*") %>%
# Split on all whitespace occurring before digits
str_split("\\s+(?=\\d)") %>%
# Turn list into a matrix
unlist() %>%
matrix(ncol = 18, byrow = TRUE) %>%
# Handling variables names
set_colnames(value =
data.full[1] %>%
str_squish() %>%
str_split("\\s+(?=\\d)") %>%
unlist) %>%
as_tibble() %>%
# Transformating variables into numeric
type_convert()