Здесь ваша проблема не в том, как использовать R для чтения этих данных, а в том, что ваши данные недостаточно структурированы с использованием обычных разделителей между полями переменной длины, которые вы используете в качестве входных данных. Кроме того, поле почтового индекса содержит несколько буквенных символов «О», которые должны быть равны «0».
Итак, вот способ использовать подстановку регулярных выражений для добавления разделителей, а затем анализировать текст с разделителями, используя read.csv()
. Обратите внимание, что в зависимости от исключений в вашем полном наборе текста вам может потребоваться настроить регулярные выражения. Я сделал их здесь шаг за шагом, чтобы было понятно, что делается, и чтобы вы могли корректировать их по мере нахождения исключений во вводимом тексте. (Например, некоторые названия городов, такие как «Wms. Bay», состоят из двух слов.)
addr.txt <- readLines("https://raw.githubusercontent.com/fonnesbeck/Bios6301/master/datasets/addr.txt")
addr.txt <- gsub("\\s+O(\\d{4})", " 0\\1", addr.txt) # replace O with 0 in zip
addr.txt <- gsub("(\\s+)([A-Z]{2})", ", \\2", addr.txt) # state
addr.txt <- gsub("\\s+(\\d{5}(\\-\\d{4}){0,1})\\s*", ", \\1", addr.txt) # zip
addr.txt <- gsub("\\s+(\\d{1,4})\\s", ", \\1, ", addr.txt) # streetno
addr.txt <- gsub("(^\\w*)(\\s+)", "\\1, ", addr.txt) # LastName (FirstName)
addr.txt <- gsub("\\s{2,}", ", ", addr.txt) # city, by elimination
addr <- read.csv(textConnection(addr.txt), header = FALSE,
col.names = c("LastName", "FirstName", "streetno", "streetname", "city", "state", "zip"),
stringsAsFactors = FALSE)
head(addr)
## LastName FirstName streetno streetname city state zip
## 1 Bania Thomas M. 725 Commonwealth Ave. Boston MA 02215
## 2 Barnaby David 373 W. Geneva St. Wms. Bay WI 53191
## 3 Bausch Judy 373 W. Geneva St. Wms. Bay WI 53191
## 4 Bolatto Alberto 725 Commonwealth Ave. Boston MA 02215
## 5 Carlstrom John 933 E. 56th St. Chicago IL 60637
## 6 Chamberlin Richard A. 111 Nowelo St. Hilo HI 96720
person
Ken Benoit
schedule
28.10.2015
dat = readLines("addr.txt")
будет получать данные в R с каждой строкой в виде текстовой строки. Затем вам нужно будет разобрать его во фрейм данных, используя функции обработки строк. Как сказал @3209Cigs, лучше задать этот вопрос на StackOverflow. - person eipi10   schedule 28.10.2015readLines
, этоdat = as.data.frame(do.call(rbind, strsplit(dat, split=" {2,10}")))
, и вы получите данные во фрейме данных. Затем просто измените имена столбцов на нужные значения. - person eipi10   schedule 28.10.2015