从left_join中删除相同的列

时间:2015-11-24 07:45:41

标签: r dplyr

我希望按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

5 个答案:

答案 0 :(得分:3)

df2中删除您不想要的所有内容 - 在这种情况下,idvalue2列:

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;不同。但是,在此特定示例中,由于elementday对于两个表中的所有记录都相同,因此我们得到相同的结果。

  

原始结果

数据

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"))