R 从左连接中删除相同的列

R 从左连接中删除相同的列,r,dplyr,R,Dplyr,我想通过id合并两个数据帧,但它们都有两个相同的列;因此,当我合并时,我会得到新的.x和.y列。如何使用left_join()合并这两个数据帧,并删除代码中当前相同的额外列(`element.x、day.x、element.y和day.y),并保留一个列 代码: #示例数据 df1df只需从df2中删除您不想要的所有内容-在本例中,id和value2列: left_join(df1, select(df2, c(id,value2)), by = "id") # id value1

我想通过
id
合并两个数据帧,但它们都有两个相同的列;因此,当我合并时,我会得到新的
.x
.y
列。如何使用
left_join()
合并这两个数据帧,并删除代码中当前相同的额外列(`element.x、day.x、element.y和day.y),并保留一个列

代码:

#示例数据

df1
df只需从
df2
中删除您不想要的所有内容-在本例中,
id
value2
列:

left_join(df1, select(df2, c(id,value2)), by = "id")

#  id     value1 element day     value2
#1  1  1.2276303   TEST1  15 -0.1389861
#2  2 -0.8017795   TEST1  15 -0.5973131
#3  3 -1.0803926   TEST1  15 -2.1839668
#4  4 -0.1575344   TEST1  15  0.2408173
#5  5 -1.0717600   TEST1  15 -0.2593554
请注意,并非所有这些答案都是等价的,因此,请询问您需要什么。例如:

df1 <- data.frame(id=1:3,day=2:4,element=3:5,value1=100:102)
df2 <- data.frame(id=1:3,day=3:5,element=4:6,value2=200:202)
df1

#  id day element value1
#1  1   2       3    100
#2  2   3       4    101
#3  3   4       5    102

df2
#  id day element value2
#1  1   3       4    200
#2  2   4       5    201
#3  3   5       6    202

left_join(df1, df2)
#Joining by: c("id", "day", "element")
#  id day element value1 value2
#1  1   2       3    100     NA
#2  2   3       4    101     NA
#3  3   4       5    102     NA

left_join(df1, select(df2, c(id,value2)), by = "id")
#  id day element value1 value2
#1  1   2       3    100    200
#2  2   3       4    101    201
#3  3   4       5    102    202
df1您只需要:

df <- left_join(df1, df2)

值得一提的是最近一封邮件的评论:“在
id
加入与在
id/element/day
加入不同。”。然而,在这个特定的示例中,由于两个表中的所有记录的
元素
日期
都是相同的,因此我们得到了相同的结果

原始结果

资料


在检查这些列是否确实相同之后,您可以在执行联接之前删除它们

if (all(df1[,c('element', 'day')] == df2[,c('element', 'day')]))
  df <- left_join(df1[,setdiff(colnames(df1),c('element', 'day'))], df2, by = "id")
else
  stop("Should not happen!?")
if(全部(df1[,c('element','day')]==df2[,c('element','day')))

df,假设两个数据集中的
元素
相同。是的,但问题指出“我的代码中当前额外的列是相同的”。如果没有,你怎么决定保留哪一个呢?这很有效,谢谢!在我的原始数据合并中,有许多相同的变量,所以我希望不必全部键入。@Axeman-“同一列”名称并不一定意味着“同一列中有相同的数据”
“如何决定保留哪一个?”
-这是一个左连接,保留合并的左侧。这很有帮助,因为我处理的原始数据集中有很多变量是相同的,但只需要按3合并。谢谢哇,我没意识到它会自动检查列。谢谢@Amsterll很高兴我能帮上忙加入
id
与加入
id/element/day
不同-请参阅下面我的扩展答案。“要得到所需的东西,必须小心。”最近的邮件感谢您的评论。您是对的,但在本例中,两个表中的三列是相同的,因此我们得到相同的结果。
df <- left_join(df1, df2)
Joining by: c("id", "element", "day")
  id     value1 element day     value2
1  1 -0.6264538   TEST1  15 -0.8204684
2  2  0.1836433   TEST1  15  0.4874291
3  3 -0.8356286   TEST1  15  0.7383247
4  4  1.5952808   TEST1  15  0.5757814
5  5  0.3295078   TEST1  15 -0.3053884
set.seed(1)
df1 <- data.frame(id = seq(1,5), value1 = rnorm(5), element = "TEST1", day = 15) 
df2 <- data.frame(id = seq(1,5), value2 = rnorm(5), element = "TEST1", day = 15) 
df <- left_join(df1, df2, by = "id")
  id     value1 element.x day.x     value2 element.y day.y
1  1 -0.6264538     TEST1    15 -0.8204684     TEST1    15
2  2  0.1836433     TEST1    15  0.4874291     TEST1    15
3  3 -0.8356286     TEST1    15  0.7383247     TEST1    15
4  4  1.5952808     TEST1    15  0.5757814     TEST1    15
5  5  0.3295078     TEST1    15 -0.3053884     TEST1    15
if (all(df1[,c('element', 'day')] == df2[,c('element', 'day')]))
  df <- left_join(df1[,setdiff(colnames(df1),c('element', 'day'))], df2, by = "id")
else
  stop("Should not happen!?")