我希望按id
合并两个数据框,但它们都有2个相同的列;因此,当我合并时,我会获得新的.x
和.y
列。如何将这两个数据框与left_join()
合并,并删除我的代码中当前相同的额外列(`element.x,day.x,element.y和day.y)并保留一个列。
代码:
# Sample data
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)
# Merge
df <- left_join(df1, df2, by = "id")
# Output
id value1 element.x day.x value2 element.y day.y
1 1 -0.69700149 TEST1 15 1.4324220 TEST1 15
2 2 -0.25514949 TEST1 15 0.7281354 TEST1 15
3 3 0.09206902 TEST1 15 0.8148839 TEST1 15
4 4 2.51799237 TEST1 15 1.3919671 TEST1 15
5 5 -0.77049050 TEST1 15 -0.2707201 TEST1 15
答案 0 :(得分:3)
从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
请注意,并非所有这些答案都是等效的,并且会问您需要什么样的结果。 E.g:
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
答案 1 :(得分:2)
你只需要:
df <- left_join(df1, df2)
by = NULL,默认情况下,
join
将使用所有变量进行自然连接 两个表中的通用名称。消息列出了变量 你可以检查他们是否正确
输出:
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
值得指出thelatemail的评论:&#34;加入id
与加入id/element/day
&#34;不同。但是,在此特定示例中,由于element
和day
对于两个表中的所有记录都相同,因此我们得到相同的结果。
原始结果
数据
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
答案 2 :(得分:2)
在检查这些列确实相同之后,您可以在执行连接之前删除它们
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!?")
答案 3 :(得分:1)
status2 = $(".status");
答案 4 :(得分:0)
我认为这是实现您想要的最简单方法。
df <- left_join(df1, df2, by = "id", suffix = c("", ".annoying_duplicate_column")) %>%
select(-ends_with(".annoying_duplicate_column"))