Лучший способ разделить применение и объединение в R, используя sp :: merge () как функцию - PullRequest
0 голосов
/ 03 мая 2019

У меня есть фрейм данных с 500 наблюдениями для каждого из 3106 округов США. Я хотел бы объединить этот фрейм данных с SpatialPolygonsDataFrame.

Я попробовал несколько подходов. Я обнаружил, что если я отфильтрую данные по переменной iter_id, я смогу использовать sp::merge() для объединения наборов данных. Я полагаю, что тогда смогу их собрать вместе. sp::merge() не допускает правое или полное объединение, и пространственные данные должны находиться в левом положении. Так что многие к одному не будут работать. Действительно неприятный способ, который я попробовал: (Я не уверен, как представить фрейм данных с интересующими переменными здесь)

library(choroplethr)
data(continental_us_states)
us <- tigris::counties(continental_us_states)

gm_y_corr <- tribble(~GEOID,~iter_id,~neat_variable,
01001,1,"value_1",
01003,1,"value_2",
...
01001,2,"value_3",
01003,2,"value_4",
...
01001,500,"value_5",
01003,500,"value_6")

filtered <- gm_y_corr %>%
  filter(iter_id ==1)

us.gm <- sp::merge(us, filtered ,by='GEOID')

for (j in 2:500) {
tmp2 <- gm_y_corr %>%
  filter(iter_id == j)
tmp3 <- sp::merge(us, tmp2,by='GEOID')
us.gm <- rbind(us.gm,tmp3)
}

Я знаю, что должен быть лучший способ. Я пытался group_by. Но найдено несколько совпадений. Поэтому я не должен понимать group_by.

> geo_dat <- gm_y_corr %>%
+   group_by(iter_id)%>%
+   sp::merge(us, .,by='GEOID')
Error in .local(x, y, ...) : non-unique matches detected

Я хотел бы объединить пространственные данные с интересными данными.

1 Ответ

1 голос
/ 03 мая 2019

Здесь вы можете использовать функцию разделения базы R в split или более позднюю dplyr::group_split.Это разделит ваш фрейм данных в соответствии с вашей переменной разделения, и вы можете lapply или purrr::map функцию, такую ​​как merge, а затем dplyr::bind_rows, чтобы свернуть возвращаемый список обратно в dataframe.Поскольку мне не удается получить данные us, я только что написал то, что, как я подозреваю, будет работать.

gm_y_corr %>% 
  group_by(iter_id) %>%  # group
  group_split() %>% # split
  lapply(., function(x){ # apply function(x) merge(us, x, by = "GEOID") to leach list element
    merge(us, x, by = "GEOID") 
  }) %>% 
  bind_rows() # collapse to data frame

эквивалентно, это то же самое, что и использование базовых функциональных возможностей R.Новый group_by %>% group_split немного более интуитивен, на мой взгляд.

gm_y_corr %>% 
  split(.$iter_id) %>% 
  lapply(., function(x){
    merge(us, x, by = "GEOID")
  }) %>% 
  bind_rows()

Если вы хотите просто использовать group_by, вам придется использовать функцию dplyr::do, которая, как я считаю, делает то же самое.к тому, что я только что сделал выше.Но без вас, чтобы разделить это самостоятельно.

...