как читать текстовые файлы и создавать фрейм данных в R

Необходимо прочитать текстовый файл в https://raw.githubusercontent.com/fonnesbeck/Bios6301/master/datasets/addr.txt

и преобразовать их в фрейм данных R с номером столбца как: LastName, FirstName, streetno, streetname, city, state и zip...

Пытался использовать команду sep для их разделения, но не удалось...


person Sheldon    schedule 28.10.2015    source источник
comment
Во-первых, dat = readLines("addr.txt") будет получать данные в R с каждой строкой в ​​виде текстовой строки. Затем вам нужно будет разобрать его во фрейм данных, используя функции обработки строк. Как сказал @3209Cigs, лучше задать этот вопрос на StackOverflow.   -  person eipi10    schedule 28.10.2015
comment
На самом деле, я думаю, все, что вам нужно сделать после readLines, это dat = as.data.frame(do.call(rbind, strsplit(dat, split=" {2,10}"))), и вы получите данные во фрейме данных. Затем просто измените имена столбцов на нужные значения.   -  person eipi10    schedule 28.10.2015


Ответы (4)


Расширяя мои комментарии, вот еще один подход. Возможно, вам потребуется настроить некоторые части кода, если ваш полный набор данных содержит более широкий набор шаблонов для учета.

library(stringr) # For str_trim 

# Read string data and split into data frame
dat = readLines("addr.txt")
dat = as.data.frame(do.call(rbind, strsplit(dat, split=" {2,10}")), stringsAsFactors=FALSE)
names(dat) = c("LastName", "FirstName", "address", "city", "state", "zip")

# Separate address into number and street (if streetno isn't always numeric,
# or if you don't want it to be numeric, then just remove the as.numeric wrapper).
dat$streetno = as.numeric(gsub("([0-9]{1,4}).*","\\1",  dat$address))
dat$streetname = gsub("[0-9]{1,4} (.*)","\\1",  dat$address)

# Clean up zip
dat$zip = gsub("O","0", dat$zip)
dat$zip = str_trim(dat$zip)

dat = dat[,c(1:2,7:8,4:6)]

dat
      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
...
41      Wright       Greg      791  Holmdel-Keyport Rd.    Holmdel    NY 07733-1988
42     Zingale    Michael     5640        S. Ellis Ave.    Chicago    IL      60637
person eipi10    schedule 29.10.2015

Попробуй это.

x<-scan("https://raw.githubusercontent.com/fonnesbeck/Bios6301/master/datasets/addr.txt" , 
  what = list(LastName="", FirstName="", streetno="", streetname="", city="", state="",zip=""))

data<-as.data.frame(x)
person Pankaj Sharma    schedule 28.10.2015
comment
Содержимое фрейма данных не соответствует ожидаемому, попробуйте head( data ) - person vaettchen; 28.10.2015

Я обнаружил, что проще всего преобразовать файл в CSV, добавив запятые там, где они принадлежат, а затем прочитать его.

## get the page as text
txt <- RCurl::getURL(
    "https://raw.githubusercontent.com/fonnesbeck/Bios6301/master/datasets/addr.txt"
)
## fix the EOL (end-of-line) markers
g1 <- gsub(" \n", "\n", txt, fixed = TRUE)
## read it
df <- read.csv(
    ## add most comma-separators, then the last for the house number
    text = gsub("(\\d+) (\\D+)", "\\1,\\2", gsub("\\s{2,}", ",", g1)), 
    header = FALSE,
    ## set the column names
    col.names = c("LastName", "FirstName", "streetno", "streetname", "city", "state", "zip")
)
## result
head(df)
#     LastName  FirstName streetno        streetname     city state   zip
# 1      Bania  Thomas M.      725 Commonwealth Ave.   Boston    MA O2215
# 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 O2215
# 5  Carlstrom       John      933       E. 56th St.  Chicago    IL 60637
# 6 Chamberlin Richard A.      111        Nowelo St.     Hilo    HI 96720
person Rich Scriven    schedule 29.10.2015

Здесь ваша проблема не в том, как использовать 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