вариация на тему ... но сначала, некоторые примерные данные:
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: Выведите правильное выражение, которое можно использовать для вставки разделителей. Здесь, кажется, выглядит шаблон (смотря с конца ) строк) набор чисел и запятых, которым предшествует пробел, которому предшествуют некоторые слова во ВСЕХ CAPS. Мы можем захватить эти группы и вставить некоторые разделители «tab» (\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
имеет «text
» аргумент, который может быть использован вместо «file
» аргумент, мы можем использовать 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]' должен сопровождаться '+' не '*', иначе вы получите 'CHICAGO-' для городов с одним словом. –
Спасибо, Хью! – Mike