dplyr加入后如何删除重复的列?

时间:2020-05-06 05:21:26

标签: r join dplyr

考虑两个数据帧, df1 df2
df1具有 id a b 列。
df2具有 id a c 列。

我想执行左连接,以便组合的数据框具有列 id a b c

combined <- df1 %>% left_join(df2, by="id")

但是在组合数据框中,列为 id ax b ay c

我可以在联接键中包含“ a”(即left_join(df1, df2, by=c("id", "a"))),但是像 a 这样的列太多了。我只想通过主键 id 加入,并将所有重复的列都放在df2中。

3 个答案:

答案 0 :(得分:1)

更通用的方法是在左联接之前删除列,否则合并的数据集最初可能非常大:

df1<- data.frame(id= seq(1:0), a=rnorm(1:10,0.2),b=rpois(10,0.2))
df2<- data.frame(id= seq(1:0), a=rnorm(1:10,0.2),c=rnorm(10,0.2))

varList<- names(df2)[!(names(df2) %in% names(df1))] # get non common names
varList<- c(varList,"id") # appending key parameter

combined <- df1 %>% left_join((df2 %>% select(varList)), by="id")

组合数据集将没有任何.x或.y

答案 1 :(得分:0)

首先,我们通过 id

执行联接
combined <- df1 %>% left_join(df2, by="id")

然后我们用 .x 重命名并删除 .y

combined <- combined %>% 
  rename_at(
    vars(ends_with(".x")),
    ~str_replace(., "\\..$","")
  ) %>% 
  select_at(
    vars(-ends_with(".y"))
  )

答案 2 :(得分:0)

我认为这是实现您想要做的事情的最简单方法

df <- left_join(df1, df2, by = "id", suffix = c("", ".annoying_duplicate_column")) %>%
  select(-ends_with(".annoying_duplicate_column"))

(结合@Ernest Han 的回答和上面@David T 的非常有用的评论)