同一个主题的变体...但是首先,一些样本数据:
cat("1 NEW YORK 7,262,700",
"2 LOS ANGELES 3,259,340",
"3 CHICAGO 3,009,530",
"4 HOUSTON 1,728,910",
"5 PHILADELPHIA 1,642,900",
"6 DETROIT 1,086,220",
"7 SAN DIEGO 1,015,190",
"8 DALLAS 1,003,520",
"9 SAN ANTONIO 914,350",
"10 PHOENIX 894,070", sep = "\n", file = "test.txt")
第一步:使用readLines
读取数据。
x <- readLines("test.txt")
步骤2:找出一个正则表达式,用于插入分隔符。在这里,模式似乎是(从行的末尾开始看),一组数字和逗号,前面有空格,前面是全大写字母的一些单词。我们可以捕获这些组并插入一些“制表符”分隔符(\t
)。额外的反斜杠是为了正确转义它们。
gsub("([A-Z ]+)(\\s?[0-9,]+$)", "\\\t\\1\\\t\\2", x)
# [1] "1\t NEW YORK \t7,262,700" "2\t LOS ANGELES \t3,259,340"
# [3] "3\t CHICAGO \t3,009,530" "4\t HOUSTON \t1,728,910"
# [5] "5\t PHILADELPHIA \t1,642,900" "6\t DETROIT \t1,086,220"
# [7] "7\t SAN DIEGO \t1,015,190" "8\t DALLAS \t1,003,520"
# [9] "9\t SAN ANTONIO \t914,350" "10\t PHOENIX \t894,070"
第三步:由于我们知道我们的gsub
正常工作,而且我们知道read.delim
有一个可以使用"text
"参数代替"file
"参数的选项,因此我们可以直接在gsub
的结果上使用read.delim
:
out <- read.delim(text = gsub("([A-Z ]+)(\\s?[0-9,]+$)", "\\\t\\1\\\t\\2", x),
header = FALSE, strip.white = TRUE)
out
可能的最后一步是将第三列转换为数字:
out$V3 <- as.numeric(gsub(",", "", out$V3))
[A-Z]
应该跟着一个+
而不是一个*
,否则你会得到单词城市CHICAGO-
。 - Scott Ritchie