Bob*_*bby 6 join r relational-database dplyr
我想为由左连接产生的所有列添加前缀。
left_join()当被连接的两个表之间的名称相同时,可以添加后缀。但是,即使它们的名称不同,它也没有始终添加此后缀的选项。并且它没有选项来代替添加前缀。
library(dplyr)
library(nycflights13)
flights2 <- flights %>% select(year:day, hour, origin, dest, tailnum, carrier)
airports2 <- airports
result <- flights2 %>% left_join(airports2, c("dest" = "faa")) %>% head()
Run Code Online (Sandbox Code Playgroud)
结果:
Source: local data frame [6 x 14]
year month day hour origin dest tailnum carrier name
(int) (int) (int) (dbl) (chr) (chr) (chr) (chr) (chr)
1 2013 1 1 5 EWR IAH N14228 UA George Bush Intercontinental
2 2013 1 1 5 LGA IAH N24211 UA George Bush Intercontinental
3 2013 1 1 5 JFK MIA N619AA AA Miami Intl
4 2013 1 1 5 JFK BQN N804JB B6 NA
5 2013 1 1 5 LGA ATL N668DN DL Hartsfield Jackson Atlanta Intl
6 2013 1 1 5 EWR ORD N39463 UA Chicago Ohare Intl
Variables not shown: lat (dbl), lon (dbl), alt (int), tz (dbl), dst (chr)
Run Code Online (Sandbox Code Playgroud)
在这里,仅从连接结果无法知道每列来自哪个原始表。
添加此前缀的目的是为了根据表名和从关系数据库加载的数据的列名可靠地计算列名。R例如,将使用加载和存储在关系数据库中的数据库结构和命名约定来识别主键和外键。然后这些将用于设置连接并稍后从连接结果中检索数据。
我发现了一个类似的问题mySQL,但不是R:
实现此目的的一种直接方法是在执行连接之前将前缀添加到原始表中:
# add prefix before joining:
names(flights2) <- paste0("flights2.", names(flights2) )
names(airports2) <- paste0("airports2.", names(airports2) )
# in join, use names with prefixes
result <- flights2 %>% left_join(airports2, c("flights2.dest" = "airports2.faa") ) %>% head()
Run Code Online (Sandbox Code Playgroud)
结果:
Source: local data frame [6 x 14]
flights2.year flights2.month flights2.day flights2.hour flights2.origin flights2.dest
(int) (int) (int) (dbl) (chr) (chr)
1 2013 1 1 5 EWR IAH
2 2013 1 1 5 LGA IAH
3 2013 1 1 5 JFK MIA
4 2013 1 1 5 JFK BQN
5 2013 1 1 5 LGA ATL
6 2013 1 1 5 EWR ORD
Variables not shown: flights2.tailnum (chr), flights2.carrier (chr), airports2.name (chr),
airports2.lat (dbl), airports2.lon (dbl), airports2.alt (int), airports2.tz (dbl),
airports2.dst (chr)
Run Code Online (Sandbox Code Playgroud)
现在,可以通过这种方式轻松引用连接的数据框: tableName.columnName