2013-09-22 6 views
3

, пожалуйста, любой может помочь мне импортировать эти данные в R из текстового или dat-файла. У этого есть пробел, но названия городов не должны рассматриваться как два имени. Как НЬЮ-ЙОРК.Импортируйте необработанные данные в R

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 

ответ

4

Для вашего конкретного кадра данных, где истинные пространства происходят только между прописными буквами, используйте регулярное выражение:

gsub("(*[A-Z]) ([A-Z]+)", "\\1-\\2", "1 NEW YORK 7,262,700") 
# [1] "1 NEW-YORK 7,262,700" 
gsub("(*[A-Z]) ([A-Z]+)", "\\1-\\2", "3 CHICAGO 3,009,530") 
# [1] "3 CHICAGO 3,009,530" 

Вы можете интерпретировать пробелы как разделителей полей.

+2

Второй '[A-Z]' должен сопровождаться '+' не '*', иначе вы получите 'CHICAGO-' для городов с одним словом. –

+0

Спасибо, Хью! – Mike

1

Расширяясь при ответе @ Хью, я попробую следующее, хотя оно не особенно эффективно.

lines <- scan("cities.txt", sep="\n", what="character") 
lines <- unlist(lapply(lines, function(x) { 
    gsub(pattern="(*[a-zA-Z]) ([a-zA-Z]+)", replacement="\\1-\\2", x) 
})) 

citiesDF <- data.frame(num = rep(0, length(lines)), 
         city = rep("", length(lines)), 
         population = rep(0, length(lines)), 
         stringsAsFactors=FALSE) 

for (i in 1:length(lines)) { 
    splitted = strsplit(lines[i], " +") 
    citiesDF[i, "num"] <- as.numeric(splitted[[1]][1]) 
    citiesDF[i, "city"] <- gsub("-", " ", splitted[[1]][2]) 
    citiesDF[i, "population"] <- as.numeric(gsub(",", "", splitted[[1]][3])) 
} 
+0

Спасибо Manetheran – Mike

4

вариация на тему ... но сначала, некоторые примерные данные:

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)) 
+0

Спасибо Mahto – Mike

Смежные вопросы