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),并保留一个列
代码:
#示例数据
df1df只需从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!?")