上的主題的變化...但第一,一些示例數據:
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