2016-05-28 3 views
1

Я пытался выяснить, как очистить и отредактировать столбец в моем наборе данных.Очистка и редактирование столбца

Набор данных, который я использую, предназначен только для города Сан-Франциско. Столбец в наборе данных, называемый «город», содержит несколько разных написаний Сан-Франциско, а также других городов. Вот как это выглядит:

таблицы (город SF $)

        Brentwood      CA 
       30401      18      370 
      DALY CITY    FOSTER CITY     HAYWARD 
        0      0      0 
      Novato     Oakland     OAKLAND 
        0      40      0 
       S F     S.F.     s.F. Ca 
        0     31428      12 
      SAN BRUNO   SAN FRANCICSO   San Franciisco 
        0      221      54 
     san francisco   san Francisco   San francisco 
       20      284      0 
     San Francisco   SAN FRANCISCO  san Francisco CA 
       78050     16603      6 
    San Francisco,  San Francisco, Ca  San Francisco, CA 
       12      4      72 
San Francisco, CA 94132   San Franciscvo   San Francsico 
        0      0      2 
    San Franicisco   Sand Francisco      sf 
       41      30      17 
       Sf      SF     SF , CA 
       214     81226      1 
     SF CA 94133     SF, CA   SF, CA 94110 
        0      9      38 
     SF, CA 94115      SF.      SF` 
        4     1656      31 
    SO. SAN FRANCISCO     SO.S.F. 
        0      6    

То, что я пытаюсь сделать, это изменить город С.Ф. $ только у «Сан-Франциско». Таким образом, все данные в sf $ city будут размещены под одним городом, Сан-Франциско. Поэтому, когда я набираю таблицу (sf $ city), она показывает только Сан-Франциско.

Могу ли я подмножество? Что-то вроде:

sf$city = subset(sf, city == "S.F." & "s.F. Ca" & "SAN FRANCICSO" & ... 

И подмножество всех переменных города, которые я хочу? Или это исказит и испортит мои данные?

+0

Непонятно, что вы спрашиваете, но если вы хотите переписать 'sf $ city' как« Сан-Франциско »для каждой записи, вот метод:' sf $ city <- «San Francisco» '. – lmo

+0

Ahh ok, достаточно просто. Но как я могу изменить его, чтобы он не включал города Окленд и не SF? –

+0

См. Мой ответ. Я думаю, что это сработает для вас, хотя ответ jota замечателен, если вы хотите развить свои навыки манипуляции строками. Обучение регулярным выражениям стоит того, если вы регулярно выполняете или будете регулярно чинить данные. – lmo

ответ

3

Я бы попробовал регулярные выражения с agrep и grep.

Пример данных:

d <- c("Brentwood", "CA", "DALY CITY", "FOSTER CITY", "HAYWARD", "Novato", 
"Oakland", "OAKLAND", "S F", "S.F.", "s.F. Ca", "SAN BRUNO", 
"SAN FRANCICSO", "San Franciisco", "san francisco", "san Francisco", 
"San francisco", "San Francisco", "SAN FRANCISCO", "san Francisco CA", 
"San Francisco,", "San Francisco, Ca", "San Francisco, CA", "San Francisco, CA 94132", 
"San Franciscvo", "San Francsico", "San Franicisco", "Sand Francisco", 
"sf", "Sf", "SF", "SF , CA", "SF CA", "94133", "SF, CA", "SF, CA 94110", 
"SF, CA 94115", "SF.", "SF`", "SO. SAN FRANCISCO", "SO.S.F.") 

Вы можете нацелить такие слова, как «Сан-Франциско» с agrep, и по умолчанию max.dist = 0.1 работает достаточно хорошо здесь. Затем вы можете просто нацелиться на S.F. Варианты использования grep

d[agrep("San Francisco", d, ignore.case = TRUE, max.dist = 0.1)] <- "San Francisco" 

d[grep("\\bS[. ]?F\\.?\\b", d, ignore.case = TRUE, perl = TRUE)] <- "San Francisco" 

# [1] "Brentwood"  "CA"   "DALY CITY"  "FOSTER CITY" 
# [5] "HAYWARD"  "Novato"  "Oakland"  "OAKLAND"  
# [9] "San Francisco" "San Francisco" "San Francisco" "SAN BRUNO"  
#[13] "San Francisco" "San Francisco" "San Francisco" "San Francisco" 
#[17] "San Francisco" "San Francisco" "San Francisco" "San Francisco" 
#[21] "San Francisco" "San Francisco" "San Francisco" "San Francisco" 
#[25] "San Francisco" "San Francisco" "San Francisco" "San Francisco" 
#[29] "San Francisco" "San Francisco" "San Francisco" "San Francisco" 
#[33] "San Francisco" "94133"   "San Francisco" "San Francisco" 
#[37] "San Francisco" "San Francisco" "San Francisco" "San Francisco" 
#[41] "San Francisco" 

adist это еще один вариант для нацеливания слова, как «Сан-Франциско». Я нашел следующие настройки, чтобы работать хорошо. Вы можете забрать «Сан-Франциско»:

d[adist("San Francisco", d, ignore.case = TRUE, 
    cost = c(del = 0.5, ins = 0.5, sub = 3)) < 3] <- "San Francisco" 
0

Чтобы перезаписать sf$city быть «Сан-Франциско» для каждой записи, вот типичный метод:

sf$city <- "San Francisco" 

Однако, если некоторые из ваших наблюдений а не Сан-Франциско, и вы хотели бы отказаться от них, вы захотите отказаться от них первым. Вот старт:

# drop non-SF observations 
sfReal <- sf[!(tolower(sf$city) %in% c("daly city", "brentwood", "hayward", "oakland"))] 

Моя география не самая лучшая, так что, возможно, мне не хватает некоторых. Кроме того, вы можете использовать %in%, чтобы включить только те наблюдения, которые находятся в Сан-Франциско. Учитывая набор, который вы указали выше, я сомневаюсь, что это так.

В будущем, если это повторяющаяся задача, вы должны изучить регулярные выражения и grep. Это удивительный инструмент, который будет выплачивать гигантские дивиденды для задач манипулирования строками. @jota предоставляет отличный способ для этого в ответе.

1

Чтобы рифф на ответ @ Джеты, вы также могли бы принять результирующий набор данных и запустить его через Google Maps API, как показано здесь: https://gist.github.com/josecarlosgonz/6417633

В частности, с помощью функций, доступных в этой ссылке, вы можете взять grep() выход и запустить

locations <- ldply(d, function(x) geoCode(x)) 
head(locations, 10) 

Который даст вам следующий вывод:

# V1   V2   V3       V4 
# 1 36.0331164 -86.7827772 APPROXIMATE   Brentwood, TN, USA 
# 2 36.778261 -119.4179324 APPROXIMATE    California, USA 
# 3 37.6879241 -122.4702079 APPROXIMATE   Daly City, CA, USA 
# 4 37.5585465 -122.2710788 APPROXIMATE   Foster City, CA, USA 
# 5 37.6688205 -122.0807964 APPROXIMATE    Hayward, CA, USA 
# 6 38.1074198 -122.5697032 APPROXIMATE    Novato, CA, USA 
# 7 37.8043637 -122.2711137 APPROXIMATE    Oakland, CA, USA 
# 8 37.8043637 -122.2711137 APPROXIMATE    Oakland, CA, USA 
# 9 37.7749295 -122.4194155 APPROXIMATE  San Francisco, CA, USA 
# 10 37.7749295 -122.4194155 APPROXIMATE  San Francisco, CA, USA 

Как это выглядит как вы знаете, что все ваши места находятся в CA, вы также можете добавить ЦС в конце вашего вектора, как показано здесь:

d[grep("CA", d, invert = TRUE)] <- paste0(d[grep("CA", d, invert = TRUE)], ", CA") 

locations <- ldply(d, function(x) geoCode(x)) 

head(locations, 10) 

Как показано ниже, это позволит убедиться, что Google мест Брентвуд в Калифорнии.

Преимущество этого подхода состоит в том, что в конечном итоге вы получите нормализованные города в V4, что может быть полезно, когда дело доходит до фильтрации и других вещей.

# V1   V2   V3       V4 
# 1 37.931868 -121.6957863 APPROXIMATE  Brentwood, CA 94513, USA 
# 2 36.778261 -119.4179324 APPROXIMATE    California, USA 
# 3 37.6879241 -122.4702079 APPROXIMATE   Daly City, CA, USA 
# 4 37.5585465 -122.2710788 APPROXIMATE   Foster City, CA, USA 
# 5 37.6688205 -122.0807964 APPROXIMATE    Hayward, CA, USA 
# 6 38.1074198 -122.5697032 APPROXIMATE    Novato, CA, USA 
# 7 37.8043637 -122.2711137 APPROXIMATE    Oakland, CA, USA 
# 8 37.8043637 -122.2711137 APPROXIMATE    Oakland, CA, USA 
# 9 37.7749295 -122.4194155 APPROXIMATE  San Francisco, CA, USA 
# 10 37.7749295 -122.4194155 APPROXIMATE  San Francisco, CA, USA 

ПРИМЕЧАНИЕ. У Google есть ограничение по скорости на его API. Если вы хотите избежать регистрации и получения ключа API, вам нужно будет поместить ldply в 10-секундные укусы, как указано в комментарии по ссылке Github выше.

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