使用 merge() 函数仅左连接 R 中的选定列
Posted
技术标签:
【中文标题】使用 merge() 函数仅左连接 R 中的选定列【英文标题】:Left join only selected columns in R with the merge() function 【发布时间】:2014-08-03 04:44:03 【问题描述】:我正在尝试左加入 2 个数据帧,但我不想加入第二个数据集中的所有变量:
例如,我有数据集 1 (DF1):
Cl Q Sales Date
A 2 30 01/01/2014
A 3 24 02/01/2014
A 1 10 03/01/2014
B 4 10 01/01/2014
B 1 20 02/01/2014
B 3 30 03/01/2014
我想离开加入数据集 2 (DF2):
Client LO CON
A 12 CA
B 11 US
C 12 UK
D 10 CA
E 15 AUS
F 91 DD
我可以使用以下代码离开加入:
合并(x = DF1, y = DF2, by = "Client", all.x=TRUE) :
Client Q Sales Date LO CON
A 2 30 01/01/2014 12 CA
A 3 24 02/01/2014 12 CA
A 1 10 03/01/2014 12 CA
B 4 10 01/01/2014 11 US
B 1 20 02/01/2014 11 US
B 3 30 03/01/2014 11 US
但是,它合并了 LO 和 CON 列。我只想合并 LO 列。
Client Q Sales Date LO
A 2 30 01/01/2014 12
A 3 24 02/01/2014 12
A 1 10 03/01/2014 12
B 4 10 01/01/2014 11
B 1 20 02/01/2014 11
B 3 30 03/01/2014 11
【问题讨论】:
您需要在DF1中将“Cl”重命名为“Client”(在上面的书面示例中)。否则合并功能不起作用。 【参考方案1】:您可以通过子集传递到合并中的数据来做到这一点:
merge(x = DF1, y = DF2[ , c("Client", "LO")], by = "Client", all.x=TRUE)
或者您可以在当前合并后简单地删除该列:)
【讨论】:
记住您需要包含要合并的变量【参考方案2】:我认为使用 dplyr
函数 select
和 left_join
会简单一些;至少我更容易理解。 dplyr
中的连接函数用于模拟 sql 参数。
library(tidyverse)
DF2 <- DF2 %>%
select(client, LO)
joined_data <- left_join(DF1, DF2, by = "Client")
在这种情况下,您实际上不需要使用“by”参数,因为列具有相同的名称。
【讨论】:
是%<%
还是%>%
?
是的,这是一个错字。我刚刚修好了。【参考方案3】:
没有什么优雅的,但这可能是另一个令人满意的答案。
merge(x = DF1, y = DF2, by = "Client", all.x=TRUE)[,c("Client","LO","CON")]
这将非常有用,尤其是当您不需要用于在结果中连接表的键时。
【讨论】:
【参考方案4】:使用dplyr
包中的left_join()
和select()
的替代解决方案,无需中间步骤:
DF1 <- DF1 %>%
left_join(DF2, by = "Client") %>%
select(-CON)
【讨论】:
以上是关于使用 merge() 函数仅左连接 R 中的选定列的主要内容,如果未能解决你的问题,请参考以下文章
R语言merge函数连接多个dataframe数据集迭代内连接dataframe数据( iteratively merge data frames in R)默认merge函数通过公共列名合并数据
R语言merge函数左连接dataframe数据(Left (outer) join in R)左连接必须将参数all设置(all.x = TRUE)默认merge函数通过公共列名合并数据集
R语言merge函数使用数据行名称内连接dataframe数据使用数据行名称连接dataframe数据设置by=0或者row.names,all=TRUE使用rownames函数为数据行命名
R语言merge函数交叉连接dataframe数据(Cross joinCartesian join笛卡尔交叉连接)merge函数进行交叉连接必须将参数by设置为NULL(by = NULL)