我有2个 Dataframe ,如下所示:
# A tibble: 52 × 2
provincia mean_price
<chr> <dbl>
1 A Coruña 137624.
2 Albacete 2115.
3 Alicante 31798.
col1 col2 col3 col4
1 04 Almería Almería <NA>
2 11 Cádiz Cádiz <NA>
3 14 Córdoba Córdoba <NA>
我尝试使用full_join
将它们连接在一起,但由于拼写不同,并非所有名称都匹配正确。我可以运行以下命令(带有相应的输出):
df1 %>%
full_join(df2, by = c("provincia" = "col2"))
# A tibble: 60 × 5
provincia mean_price col1 col3 col4
<chr> <dbl> <chr> <chr> <chr>
1 A Coruña 137624. NA NA NA
2 Albacete 2115. 02 Albacete NA
3 Alicante 31798. NA NA NA
4 Almería -210404. 04 Almería NA
因此,它能够匹配许多名字,但在少数问题上失败了。在另一篇专栏文章中,我有不同的拼写变体:
df1 %>%
full_join(df2, by = c("provincia" = "col3")) %>%
drop_na(col4)
provincia mean_price col1 col2 col4
<chr> <dbl> <chr> <chr> <chr>
1 Lugo -134055. 27 Lugo Lugo
2 Pontevedra -374778. 36 Pontevedra Pontevedra
3 La Coruña NA 15 Coruña, A A Coruña
4 Orense NA 32 Ourense Ourense
因此,我有2个 Dataframe 要连接,在df1
中,列不变,始终为provincias
-在df2
中,如果名称与col1
中的名称不匹配,则尝试col2
,然后尝试col3
,依此类推,直到所有列都已应用,以尝试full_join
数据。
一些问题示例如下:
在df1
中,我们有
A Coruña
Alicante
Castellón
在df2
中我们有:
col2 = Coruña, A
col3 = La Coruña
col4 = A Coruña # joined up using this
以及
col2 = Alicante/Alacant
col3 = Alicante # joined up using this
col4 = NA
以及
col2 = Castellón/Castelló
col3 = Castellón # joined up using this
col4 = NA
预期产出:尝试创建一个函数来Map/循环,并尝试将数据联接在一起,如果前一列联接不成功,则沿着列移动。
数据
df1 = structure(list(provincia = c("A Coruña", "Albacete", "Alicante",
"Almería", "Araba - Álava", "Asturias", "Ávila", "Badajoz",
"Barcelona", "Bizkaia", "Burgos", "Cáceres", "Cádiz", "Cantabria",
"Castellón", "Ceuta", "Ciudad Real", "Córdoba", "Cuenca", "Gipuzkoa",
"Girona", "Granada", "Guadalajara", "Huelva", "Huesca", "Illes Balears",
"Jaén", "La Rioja", "Las Palmas", "León", "Lleida", "Lugo",
"Madrid", "Málaga", "Melilla", "Murcia", "Navarra", "Ourense",
"Palencia", "Pontevedra", "Salamanca", "Santa Cruz de Tenerife",
"Segovia", "Sevilla", "Soria", "Tarragona", "Teruel", "Toledo",
"Valencia", "Valladolid", "Zamora", "Zaragoza"), mean_price = c(137624.198693295,
2114.81534770306, 31797.6042278187, -210404.350690943, 677319.793678721,
-105607.758762033, -149924.778464006, -2097656.49617517, 128038.251992261,
-378733.392057684, 191990.956696032, 695.564248280345, 1428676.05256214,
3153.68145681899, 718682.972504407, -190874.713744811, 106101.705786415,
338330.550863887, 13849.7490258121, 87318.2683658272, 118338.163156024,
162218.313332224, -851960.092180063, 221206.432450402, 90652.890697791,
-8181130.3432743, 44727.9976028575, -1573959.50553556, -497997.406878741,
927365.585585463, 145165.81648469, -134054.92318867, 987306.447344823,
150960.003949561, -517183.316043251, -267412.822954099, -414282.66968961,
1013507.94117714, 589115.889523749, -374778.481273493, 108896.549765545,
-9019.89307188885, -52818.219435273, -217912.286950506, 6030463.0529272,
361426.680584978, -1069517.98520776, 135542.864155717, -236847.461222156,
156897.290850635, -80528.5521733855, 333167.648531738)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -52L))
df2 = structure(list(col1 = c("04", "11", "14", "18", "21", "23", "29",
"41", "22", "44", "50", "33", "07", "35", "38", "39", "05", "09",
"24", "34", "37", "40", "42", "47", "49", "02", "13", "16", "19",
"45", "08", "17", "25", "43", "03", "12", "46", "06", "10", "15",
"27", "32", "36", "28", "30", "31", "01", "20", "48", "26", "51",
"52"), col2 = c("Almería", "Cádiz", "Córdoba", "Granada",
"Huelva", "Jaén", "Málaga", "Sevilla", "Huesca", "Teruel",
"Zaragoza", "Asturias", "Balears, Illes", "Palmas, Las", "Santa Cruz de Tenerife",
"Cantabria", "Ávila", "Burgos", "León", "Palencia", "Salamanca",
"Segovia", "Soria", "Valladolid", "Zamora", "Albacete", "Ciudad Real",
"Cuenca", "Guadalajara", "Toledo", "Barcelona", "Girona", "Lleida",
"Tarragona", "Alicante/Alacant", "Castellón/Castelló", "Valencia/València",
"Badajoz", "Cáceres", "Coruña, A", "Lugo", "Ourense", "Pontevedra",
"Madrid", "Murcia", "Navarra", "Araba/Álava", "Gipuzkoa", "Bizkaia",
"Rioja, La", "Ceuta", "Melilla"), col3 = c("Almería", "Cádiz",
"Córdoba", "Granada", "Huelva", "Jaén", "Málaga", "Sevilla",
"Huesca", "Teruel", "Zaragoza", "Asturias", "Baleares", "Las Palmas",
"Santa Cruz de Tenerife", "Cantabria", "Ávila", "Burgos", "León",
"Palencia", "Salamanca", "Segovia", "Soria", "Valladolid", "Zamora",
"Albacete", "Ciudad Real", "Cuenca", "Guadalajara", "Toledo",
"Barcelona", "Gerona", "Lérida", "Tarragona", "Alicante", "Castellón",
"Valencia", "Badajoz", "Cáceres", "La Coruña", "Lugo", "Orense",
"Pontevedra", "Madrid", "Murcia", "Navarra", "Álava", NA, NA,
"La Rioja", "Ceuta", "Melilla"), col4 = c(NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, "A Coruña", "Lugo", "Ourense", "Pontevedra", NA, NA,
NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-52L))
1条答案
按热度按时间n9vozmp41#
我们可以使用
fuzzyjoin
中的regex_full_join
如果我们想按顺序对col2、col3、col4中的每一个进行连接,下面是一个使用
powerjoin
的方法