我想合并两个数据帧。第一个有较少的行(2354)、一个唯一ID和两个重复ID (CVE_MUN和CVE_ENT),这两个是地理标识符。
# A tibble: 2,354 x 6
CLAVE NOMBRE CVE_ENT `ENTIDAD FEDERATIVA~ CVE_MUN `MUNICIPIO (INEG~
<chr> <chr> <dbl> <chr> <dbl> <chr>
1 03AGN-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES
2 03AGO-~ Agostaderito 1 AGUASCALIENTES 1 AGUASCALIENTES
3 03AGP-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES
4 03AGS-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES
5 03AIS-~ Alfa Nissan 1 AGUASCALIENTES 1 AGUASCALIENTES
6 03ALF-~ Nissan Mexi~ 1 AGUASCALIENTES 1 AGUASCALIENTES
7 03APT-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES
8 03ASS-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES
9 03ASU-~ Asuncion 1 AGUASCALIENTES 1 AGUASCALIENTES
10 03AYU-~ Ayuntamiento 1 AGUASCALIENTES 1 AGUASCALIENTES 所以我在某个区域有26个不同的ID (CLAVE) (CVE_ENT:1,CVE_MUN: 1),另一个区域有3个ID (CVE_ENT:1,CVE_MUN:2)等等。
CVE_ENT CVE_MUN Freq
1 1 26
1 2 3
1 3 2
1 5 3
1 6 1
1 7 1
1 9 1
1 10 2
1 11 2我想映射所有的ID,所以我试图把它合并到一个非常详细的地理数据框架中。这个数据帧有299615行,每个"MAPA“行都有一个独特的长坐标。
MAPA CVE_ENT NOM_ENT NOM_ABR CVE_MUN NOM_MUN CVE_LOC
1 10010001 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 1
2 10010094 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 94
3 10010096 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 96
4 10010100 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 100
5 10010102 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 102
6 10010104 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 104
7 10010106 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 106
8 10010112 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 112
9 10010113 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 113
10 10010120 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 120
11 10010121 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 121
12 10010125 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 125
13 10010126 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 126
14 10010127 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 127
15 10010128 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 128
16 10010135 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 135
17 10010138 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 138
18 10010139 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 139
19 10010141 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 141
20 10010144 1 AGUASCALIENTES AGS. 1 AGUASCALIENTES 144同样,我有CVE_ENT和CVE_MUN,但这一次比第一个数据帧重复了很多次。
CVE_ENT CVE_MUN Freq
1 1 725
1 2 242
1 3 293
1 4 94我想要的是将给定df1的CVE_ENT和CVE_MUN与df2合并,而不重复MAPA。也就是说,给定CVE_ENT和CVE_MUN,"CLAVE“将合并到不同的"MAPA”中。理想情况下,df1会将最初的26 CVE_ENT=1和CVE_MUN=1合并到最初的26 CVE_ENT=1和CVE_MUN=1 of df2。
到目前为止,我已经尝试了left_join和过滤"CLAVE“,但我得到的"MAPA”再次重复,我没有一个独特的地理长,拉特。
Coord<-left_join(df1,df2,by=c("CVE_ENT","CVE_MUN"))
DT <- Coord[!duplicated(Coord$CLAVE),]我理想的最终数据框架如下:
CLAVE NOMBRE CVE_ENT `ENTIDAD FEDERATIVA~ CVE_MUN `MUNICIPIO (INEG~ MAPA
1 03AGN-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES 10010001
2 03AGO-~ Agostaderito 1 AGUASCALIENTES 1 AGUASCALIENTES 10010094
3 03AGP-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES 10010096
4 03AGS-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES 10010100
5 03AIS-~ Alfa Nissan 1 AGUASCALIENTES 1 AGUASCALIENTES 10010102
6 03ALF-~ Nissan Mexi~ 1 AGUASCALIENTES 1 AGUASCALIENTES 10010104
7 03APT-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES 10010106
8 03ASS-~ Aguascalien~ 1 AGUASCALIENTES 1 AGUASCALIENTES 10010112
9 03ASU-~ Asuncion 1 AGUASCALIENTES 1 AGUASCALIENTES 10010113
10 03AYU-~ Ayuntamiento 1 AGUASCALIENTES 1 AGUASCALIENTES 10010120 发布于 2020-08-27 00:29:59
你可以分两步完成:
df1和df2的匹配子集( join通常所做的)cbind()或bind_cols(),因为实际上您不希望执行联接<<代码>G 210为了将匹配的子集保持在一起,使用嵌套是可行的。
library(tidyverse)
# Dummy data
df1 <- tibble(uniq_id = letters[1:10],
id1 = rep(1:3, times = c(5,3,2)),
id2 = rep(1:5, each = 2))
df2 <- tibble(id1 = rep(1:3, each = 15),
id2 = rep(1:5, times = 9),
coord = paste("coord",id1, id2, c(LETTERS, LETTERS[1:19]), sep="-"))
df1 %>%
nest_join(df2, by = c("id1", "id2")) %>%
nest(df1 = uniq_id) %>%
rowwise() %>%
mutate(cbound = list(bind_cols(df1, df2[1:nrow(df1), ]))) %>%
select(-df1, -df2) %>%
unnest(cbound)但是我确实怀疑为什么要这样做:通常,连接是很好定义的,因为您有一个特殊的条件来匹配df1中的行和df2。在这里,为什么AGN有MAPA=10010001,AGO有MAPA=10010094,而不是相反?
基R解
您可以使用基本R解决方案获得相同的结果:
# Dummy data
df1 <- data.frame(uniq_id = letters[1:10],
id1 = rep(1:3, times = c(5,3,2)),
id2 = rep(1:5, each = 2))
df2 <- data.frame(id1 = rep(1:3, each = 15),
id2 = rep(1:5, times = 9))
df2$coord <- paste("coord",df2$id1, df2$id2, c(LETTERS, LETTERS[1:19]), sep="-")
parallel_merge <- function(xy){
x <- xy[1]
y <- xy[2]
df1_rows <- which(df1$id1 == x & df1$id2 == y)
if(length(df1_rows) == 0) return(NULL)
df2_rows <- which(df2$id1 == x & df2$id2 == y)
df2_rows <- df2_rows[1:length(df1_rows)]
cbind(df1[df1_rows,],
df2[df2_rows,])
}
combinations <- expand.grid(unique(df1$id1), unique(df2$id2))
coords_by_comb <- apply(combinations, 1, parallel_merge)
do.call(rbind, coords_by_comb)逻辑略有不同:我们首先使用expand.grid()生成id1和id2的每个组合,然后使用apply()对这些组合进行循环(注意,如果在df1中不存在某些组合,这不是一个最佳解决方案)。对于每个组合,在函数parallel_merge()中,我们找到要保留的df1子集,保持df2子集,并截断它以匹配df1。那我们只需要组装所有的东西。
https://stackoverflow.com/questions/63599276
复制相似问题