我喜欢dplyr
中的联接。无论数据源(本地数据帧,远程数据库表)如何,它们都能非常顺利地工作。 但是,我遇到了一个问题,其中联接的行为因数据源而异。我需要解决下面描述的问题。我认为这不是一个错误,而是与后端是sqlite有关。
我可以使用dplyr轻松加入以下表格。
observation <- data.frame(id=101:105, specimen_id=1:5, variable_id=1:5, value=rnorm(5))
specimen <- data.frame(id=1:5, specimen_name=LETTERS[1:5], species_id=1:5)
species <- data.frame(id=1:5, species_name=LETTERS[11:15])
variable <- data.frame(id=1:5, variable_name=LETTERS[6:10])
observation %>%
left_join(specimen, by=c("specimen_id"="id")) %>%
left_join(species, by=c("species_id"="id")) %>%
left_join(variable, by=c("variable_id"="id"))
结果是
id specimen_id variable_id value specimen_name species_id species_name variable_name
1 101 1 1 -0.6782149 A 1 K F
2 102 2 2 -1.3226305 B 2 L G
3 103 3 3 -0.2670939 C 3 M H
4 104 4 4 -1.2546326 D 4 N I
5 105 5 5 -1.1453585 E 5 O J
但是,如果我将相同的数据帧复制到sqlite数据源,则相同的连接代码将失败。
#create a database locally, and copy the dataframes
my_db <- src_sqlite("my_db.sqlite3", create = T)
copy_to(my_db, df=observation, temporary = FALSE)
copy_to(my_db, df=specimen, temporary = FALSE)
copy_to(my_db, df=species, temporary = FALSE)
copy_to(my_db, df=variable, temporary = FALSE)
#connect to those tables using dplyr
observation <- tbl(my_db, "observation")
specimen <- tbl(my_db, "specimen")
species <- tbl(my_db, "species")
variable <- tbl(my_db, "variable")
现在,相同的连接代码将失败。
observation %>%
left_join(specimen, by=c("specimen_id"="id")) %>%
left_join(species, by=c("species_id"="id")) %>%
left_join(variable, by=c("variable_id"="id"))
导致以下错误:
Error in sqliteSendQuery(conn, statement) :
error in statement: ambiguous column name: id.y