如何解决使用唯一ID
我想合并两个数据框。第一个具有较少的行(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
所以我在某个区域(CVE_ENT:1,CVE_MUN:1)有26个不同的ID(CLAVE),在另一个区域(CVE_ENT:1,CVE_MUN:2)中有3个ID,等等。
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
我想要的是将给定CVE_ENT和CVE_MUN的df1与df2合并,而无需重复MAPA。也就是说,在给定CVE_ENT和CVE_MUN的情况下,“ CLAVE”将合并到另一个“ MAPA”。理想情况下,df1会将df2的前26个CVE_ENT = 1和CVE_MUN = 1合并到df2的前26个CVE_ENT = 1和CVE_MUN = 1。
到目前为止,我已经尝试过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
解决方法
您可以分两个步骤进行操作:
- 找到
df1
和df2
的匹配子集(join
通常这样做) - 将它们与
cbind()
或bind_cols()
绑定,因为您实际上不想进行加入
要使匹配的子集保持在一起,使用嵌套是很实用的。
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),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,而不是相反?
Base R解决方案
您可以使用基础R解决方案获得相同的结果:
# Dummy data
df1 <- data.frame(uniq_id = letters[1:10],each = 2))
df2 <- data.frame(id1 = rep(1:3,times = 9))
df2$coord <- paste("coord",df2$id1,df2$id2,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
。然后,我们只需要组装所有东西。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。