考慮這個包含 3 個縣、3 個鎮以及與它們相關聯的一系列郵政編碼的嵌套資料框示例。其中兩個城鎮具有相同的名稱 ( B),但位于不同的縣:
df <- tibble(
county = c(1,1,1,2,2,2,2,3),
town = c("A","A","A","B","B","B","B","B"),
zip = c(12864,12865,12866,89501,89502,89503,89504,76512)) %>%
nest(data=c(zip))
我有另一個包含城鎮名稱、郵政編碼和占位符值的資料框,但缺少縣欄位:
df2 <- tibble(
town = c("A", "B", "B"),
zip = c(12866, 89504, 76512),
value = c("foo", "bar", "ski"))
我的真實資料有數百個這些重復城鎮名稱的實體,我需要將這兩個表連接在一起,以便每個城鎮根據郵政編碼(而不是城鎮名稱,它有重復)獲得正確的占位符值。然而,dplyr似乎只加入了 equal。因此,我被卡住了 - 我所追求的是類似于inner_join(df, df2, by = c(df2$zip %in% df$data$zip)),但這顯然不起作用。
我也知道data.table能夠處理 joins 中的不平等,但這似乎總是與大于/小于條件有關。在資料幀之間有超過 3 個整齊匹配的行的情況下,如何成功連接這些表以回傳以下輸出?
county town data value
<dbl> <chr> <list> <chr>
1 1 A <tibble [3 x 1]> foo
2 2 B <tibble [4 x 1]> bar
3 3 B <tibble [1 x 1]> ski
uj5u.com熱心網友回復:
我們可以這樣做 map
library(purrr)
library(dplyr)
df %>%
mutate(value = map_chr(data, ~ inner_join(.x, df2, by = 'zip') %>%
pull(value)))
-輸出
# A tibble: 3 × 4
county town data value
<dbl> <chr> <list> <chr>
1 1 A <tibble [3 × 1]> foo
2 2 B <tibble [4 × 1]> bar
3 3 B <tibble [1 × 1]> ski
或者另一種選擇是 regex_inner_join
library(fuzzyjoin)
library(stringr)
library(dplyr)
library(purrr)
df %>%
mutate(zip = map_chr(data, ~ str_c(.x$zip, collapse="|"))) %>%
regex_inner_join(df2 %>%
select(-town), by = "zip") %>%
select(-starts_with('zip'))
-輸出
# A tibble: 3 × 4
county town data value
<dbl> <chr> <list> <chr>
1 1 A <tibble [3 × 1]> foo
2 2 B <tibble [4 × 1]> bar
3 3 B <tibble [1 × 1]> ski
uj5u.com熱心網友回復:
我認為你必須“推出自己的加入”:
df %>% mutate(value = df2$value[
sapply(data, function(x) match(unlist(x), df2$zip) %>% .[!is.na(.)])
])
這適用于提供的示例,但我不清楚在一組 df$data$zip 中是否有多個匹配 df2$zip 的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315240.html
