上的主题的变化...但第一,一些示例数据:
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")
步骤1:阅读与readLines
x <- readLines("test.txt")
数据步骤2:找出可以用来插入分隔符的正则表达式。在这里,模式似乎是(从行的结尾看)一组数字和逗号,前面加空格,前面加上ALL CAPS中的一些单词。我们可以捕获这些组并插入一些“制表符”分隔符(\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"
步骤3:因为我们知道我们的gsub
工作,我们知道,read.delim
具有可以用来代替“file
”的说法是“text
”的说法,我们可以直接使用read.delim
对gsub
结果:
out <- read.delim(text = gsub("([A-Z ]+)(\\s?[0-9,]+$)", "\\\t\\1\\\t\\2", x),
header = FALSE, strip.white = TRUE)
out
# V1 V2 V3
# 1 1 NEW YORK 7,262,700
# 2 2 LOS ANGELES 3,259,340
# 3 3 CHICAGO 3,009,530
# 4 4 HOUSTON 1,728,910
# 5 5 PHILADELPHIA 1,642,900
# 6 6 DETROIT 1,086,220
# 7 7 SAN DIEGO 1,015,190
# 8 8 DALLAS 1,003,520
# 9 9 SAN ANTONIO 914,350
# 10 10 PHOENIX 894,070
一个可能的最后一步是将第三列转换为数值:
out$V3 <- as.numeric(gsub(",", "", out$V3))
第二个'[A-Z]'后面应该跟一个'+'而不是'*',否则最后会有一个城市的“芝加哥”。 –
谢谢休! – Mike