您的问题不是如何使用R来读取这个数据,而是您的数据在输入变量长度字段之间没有足够的结构化常规分隔符。此外,邮政编码字段包含一些字母“O”,应该为“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)
addr.txt <- gsub("(\\s+)([A-Z]{2})", ", \\2", addr.txt)
addr.txt <- gsub("\\s+(\\d{5}(\\-\\d{4}){0,1})\\s*", ", \\1", addr.txt)
addr.txt <- gsub("\\s+(\\d{1,4})\\s", ", \\1, ", addr.txt)
addr.txt <- gsub("(^\\w*)(\\s+)", "\\1, ", addr.txt)
addr.txt <- gsub("\\s{2,}", ", ", addr.txt)
addr <- read.csv(textConnection(addr.txt), header = FALSE,
col.names = c("LastName", "FirstName", "streetno", "streetname", "city", "state", "zip"),
stringsAsFactors = FALSE)
head(addr)
dat = readLines("addr.txt")
将以每行文本字符串的形式将数据读入R中。然后,您需要使用字符串操作函数将其解析为数据框。正如@3209Cigs所说,最好在StackOverflow上提出这个问题。 - eipi10readLines
之后,你只需要执行dat = as.data.frame(do.call(rbind, strsplit(dat, split=" {2,10}")))
,就可以将数据转换成数据框。然后只需将列名更改为所需的值即可。 - eipi10