2016-02-05 1 views
1

EDIT Благодаря @ user5249203, указав, что геокодирование лучше всего делать с помощью геокодирования ggmaps. Однако следите за NA.применяет функцию к каждой ячейке в столбце кадра данных в R

Я борюсь с apply семьи в R.

Я использую function которая принимает строку и возвращает долготу и широту

> gGeoCode("Philadelphia, PA") [1] 39.95258 -75.16522

У меня есть простой dataframe который имеет имена всех 52 штатов:

dput(state_lat_long) 
structure(
    list(State = structure(
    c(
     32L, 28L, 43L, 5L, 23L, 34L, 
     30L, 13L, 14L, 38L, 22L, 25L, 15L, 20L, 24L, 40L, 46L, 21L, 9L, 
     18L, 48L, 10L, 7L, 4L, 3L, 31L, 35L, 37L, 49L, 44L, 12L, 6L, 
     17L, 36L, 11L, 39L, 42L, 8L, 47L, 33L, 16L, 1L, 29L, 27L, 26L, 
     19L, 41L, 50L, 2L, 45L 
    ), .Label = c(
     "alabama", "alaska", "arizona", 
     "arkansas", "california", "colorado", "connecticut", "delaware", 
     "florida", "georgia", "hawaii", "idaho", "illinois", "indiana", 
     "iowa", "kansas", "kentucky", "louisiana", "maine", "maryland", 
     "massachusetts", "michigan", "minnesota", "mississippi", "missouri", 
     "montana", "nebraska", "nevada", "new hampshire", "new jersey", 
     "new mexico", "new york", "north carolina", "north dakota", "ohio", 
     "oklahoma", "oregon", "pennsylvania", "rhode island", "south carolina", 
     "south dakota", "tennessee", "texas", "utah", "vermont", "virginia", 
     "washington", "west virginia", "wisconsin", "wyoming" 
    ), class = "factor" 
)), .Names = "State", row.names = c(NA,-50L), class = "data.frame" 
) 

Практиковать мои apply, я просто хочу применить gGeoCode к каждой ячейке в единственном столбце фрейма данных state_lat_long.

Не может быть намного проще.

Тогда в чем проблема с этим?

> View(apply(state_lat_long, function(x) gGeoCode(x))) 

Когда я запускаю это, я получаю:

Error in View : argument "FUN" is missing, with no default 

, которую я не понимаю, потому что FUN не хватает.

Итак, давайте попробуем sapply. Это должно быть просто, не так ли?

Но что не так с этим?

View(sapply(state_lat_long$State, function(x) gGeoCode(x))) 

Когда я запускаю это, я получаю 2 строки с 50 колоннами, наполненную NA с. Я не могу понять это.

Далее я попытался

View(apply(state_lat_long, 2, function(x) gGeoCode(x))) 

и я получил

 State 
    40.71278 
-74.00594 

Опять же, это не имеет никакого смысла!

Что я делаю неправильно? Благодарю.

+0

Вы должны ввести 3-х аргументов, когда вы делаете подать заявление. Первый из них - ваш объект (например, dataframe), второй указывает, следует ли применять по строкам или столбцам (вам понадобится 2 для столбцов), а третий - FUN. В вашем коде отсутствовал третий аргумент, поэтому попробуйте View (apply (state_lat_long, 2, function (x) gGeoCode (x))) – hodgenovice

+0

можете ли вы проверить мое редактирование на исходный вопрос? –

+0

Может быть, я перепутался, и это должно быть View (apply (state_lat_long, 1, function (x) gGeoCode (x)))? Если нет, это, вероятно, менее просто, чем я думал, и мне нужно будет увидеть, что код, который вы использовали для gGeoCode, может быть полезен (что я могу или не могу). – hodgenovice

ответ

1

Я понимаю, что этот вопрос был в первую очередь о *apply, но, если вы только после того, как геокодов более простой вариант будет использовать vectorised функции, такие как ggmap::geocode

state_lat_long <- structure(
    list(State = structure(
    c(
     32L, 28L, 43L, 5L, 23L, 34L, 
     30L, 13L, 14L, 38L, 22L, 25L, 15L, 20L, 24L, 40L, 46L, 21L, 9L, 
     18L, 48L, 10L, 7L, 4L, 3L, 31L, 35L, 37L, 49L, 44L, 12L, 6L, 
     17L, 36L, 11L, 39L, 42L, 8L, 47L, 33L, 16L, 1L, 29L, 27L, 26L, 
     19L, 41L, 50L, 2L, 45L 
    ), .Label = c(
     "alabama", "alaska", "arizona", 
     "arkansas", "california", "colorado", "connecticut", "delaware", 
     "florida", "georgia", "hawaii", "idaho", "illinois", "indiana", 
     "iowa", "kansas", "kentucky", "louisiana", "maine", "maryland", 
     "massachusetts", "michigan", "minnesota", "mississippi", "missouri", 
     "montana", "nebraska", "nevada", "new hampshire", "new jersey", 
     "new mexico", "new york", "north carolina", "north dakota", "ohio", 
     "oklahoma", "oregon", "pennsylvania", "rhode island", "south carolina", 
     "south dakota", "tennessee", "texas", "utah", "vermont", "virginia", 
     "washington", "west virginia", "wisconsin", "wyoming" 
    ), class = "factor" 
)), .Names = "State", row.names = c(NA,-50L), class = "data.frame" 
) 

library(ggmap) 

## to make sure we're using the correct geocode function I call it with 'ggmap::geocode' 
ggmap::geocode(as.character(state_lat_long$State)) 
... 
#   lon  lat 
# 1 -74.00594 40.71278 
# 2 -116.41939 38.80261 
# 3 -99.90181 31.96860 
# 4 -119.41793 36.77826 
# 5 -94.68590 46.72955 
# 6 -101.00201 47.55149 
+0

Я думаю, что это лучшая идея - не используйте APPLY и вместо этого используйте геокод из ggmap. –

1

Это как ваш фрейм данных?

df = data.frame(State = c(
    32L, 28L, 43L, 5L, 23L, 34L, 
    30L, 13L, 14L, 38L, 22L, 25L, 15L, 20L, 24L, 40L, 46L, 21L, 9L, 
    18L, 48L, 10L, 7L, 4L, 3L, 31L, 35L, 37L, 49L, 44L, 12L, 6L, 
    17L, 36L, 11L, 39L, 42L, 8L, 47L, 33L, 16L, 1L, 29L, 27L, 26L, 
    19L, 41L, 50L, 2L, 45L 
), Label = c(
    "alabama", "alaska", "arizona", 
    "arkansas", "california", "colorado", "connecticut", "delaware", 
    "florida", "georgia", "hawaii", "idaho", "illinois", "indiana", 
    "iowa", "kansas", "kentucky", "louisiana", "maine", "maryland", 
    "massachusetts", "michigan", "minnesota", "mississippi", "missouri", 
    "montana", "nebraska", "nevada", "new hampshire", "new jersey", 
    "new mexico", "new york", "north carolina", "north dakota", "ohio", 
    "oklahoma", "oregon", "pennsylvania", "rhode island", "south carolina", 
    "south dakota", "tennessee", "texas", "utah", "vermont", "virginia", 
    "washington", "west virginia", "wisconsin", "wyoming" 
)) 

head(df) 
    State  Label 
1 32 alabama 
2 28  alaska 
3 43 arizona 
4  5 arkansas 
5 23 california 
6 34 colorado 

apply(df, 1, function(x) gGeoCode(x)) 

В качестве альтернативы,

mapply(FUN = gGeoCode, df$Label, SIMPLIFY = T) 

Примечание: В некоторых штатах до сих пор бросает NA. Повторный запуск кода позволяет получить отсутствующие координаты. Но я ожидаю, что он будет работать более эффективно, если мы будем знать ваш формат входного формата/dataframe. Кроме того, важно убедиться, что аргументы, которые вы передаете, - это то, что ожидает gGeoCode.

+0

Итак, причина, по которой состояния вызывают 'NA', обусловлена ​​функцией, а не применяемой. Понимаю. –

+0

Я думаю, вам нужно понять, как работает fuxntion. когда вы передаете название состояния отдельно ... оно дает координаты. Но проблема здесь в том, как вы ее передаете или что передаете функцию. Apply или mapply помогает вам использовать функцию без цикла for. Но вам нужно знать, какие координаты являются правильными, а какие - неправильными. – user5249203

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

  • Нет связанных вопросов^_^