【问题标题】:Removal extra column from a dataframe after full_join function in R在 R 中的 full_join 函数之后从数据框中删除额外的列
【发布时间】:2021-07-12 21:16:33
【问题描述】:

我目前参与 R 中的数据操作任务,并尝试在所选列上组合两个数据集(= 使用主键和外键 - Column2)

Column1 <- c("Name1", "Name2", "Name3", "Name4")
Column2 <- c("ID1", "ID2", "ID3", "ID4")
Column3 <- c(4, 5, 6, 7)
Column4 <- c(8, 9, 10, 11)
Column5 <- c(1, 2, 3, 4)

table1 <- data.frame(Column1, Column2, Column3, Column4, Column5)
Column1 <- c("Name1", "Name2", "Name3", "Name4")
Column2 <- c("ID4", "ID5", "ID6", "ID7")
Column3 <- c(22, 33, 44, 66)
Column4 <- c(66, 55, 77, 77)
Column5 <- c(1, 2, 3, 4)

table2 <- data.frame(Column1, Column2, Column3, Column4, Column5)
table3 <- full_join(table1, table2, by = "Column2")

我选择了完全连接函数,因为它可能有助于解决我的任务,但遇到了一个问题:使用 full_join 函数 R 显示第二个表中的 Column1.y 列,而不是列出该列的值Column.1.x

例如,R 产生:Column.1.x 然后是 Column2, Column3.x, Column4.x, Column5.x,在 Column5.x 旁边我要显示 Columns "Column3.y", "Column4.y ", "Column5.y", 但 "Column.1.y" 显示在 Column5.x 之后,而不是向下显示到列出所有名称的 "Column.1.x"。

我该如何解决? :)

【问题讨论】:

  • 欢迎来到stackoverflow。为了获得足够的支持,请提供一个最小的可重现示例stackoverflow.com/help/minimal-reproducible-example>。我猜你需要另一个连接(可能是 inner_join 或 left_join)。
  • 如果没有reprex,就很难回答,但是您可以不添加一个步骤来取消选择您的Column.1.y 吗?类似于:full_join(x,y) %>% select(-Column1.y)
  • DarwinsBeard,感谢您的帮助!您列出的代码确实删除了整个列“Column1.y”,但将这一列的值显示为“Column1.x”的值也很重要..
  • 图片不是共享数据/代码的正确方式。以更易于复制的可复制格式添加它们。阅读how to give a reproducible example

标签: r dataframe data-manipulation


【解决方案1】:

我选择@DarwinsBeard,您可以“删除”不需要的列 Column1.y。 请记住,您可以使用超过 1 个键执行连接。这就是您获得 Column1.x 和 Column1.y 的原因,因为这不是连接键并且出现在两个表中。

检查以下内容:

df1 <- tibble( Column1 = c("Name1","Name2","Name3","Name4")
              ,Column2 = c("ID1","ID2","ID3","ID4")
              # I save Column3 and Column4 
              ,Column5 = c(1,2,3,4)
              )
df2 <- tibble( Column1 = c("Name4","Name5","Name6","Name7")
              ,Column2 = c("ID4","ID5","ID6","ID7")
              ,Yes     = c(8,5,6,7) 
              ,No      = c(13,10,11,12)
              ,Neither = NA
              )

# full join keeps columns of both data frames, but replicates Column1
# as the join was only performed on the id-column, i.e. Column2
# as suggested above, remove the unwanted Column1.y with a select(-...) call
df12 <- full_join(df1, df2, by = c("Column2"))
df12

# what I think you want
df12 <- full_join(df1, df2, by = c("Column1","Column2"))
df12

后者通过保持两个关键列的完整性为您提供完全合并的数据集。

注意:您可以使用 select() 调用重新调整列的顺序,使其符合您的喜好。例如。试试:df12 %&gt;% select(Yes, No, Either, everything()) 看看会发生什么。

【讨论】:

  • 很高兴看到您可以继续前进。我也感谢您努力从问题的初始图片转移到一些代码以重新创建问题数据。这很接近一个代表,会让你在这里结交很多朋友。祝您旅途愉快!
【解决方案2】:
df3 <- df1 %>% 
  full_join(df2,by = c("Column1" = "Column1"))
df3

输出:

  Column1 Column2.x Column5 Column2.y   Yes    No Neither
  <chr>   <chr>       <dbl> <chr>     <dbl> <dbl> <lgl>  
1 Name1   ID1             1 NA           NA    NA NA     
2 Name2   ID2             2 NA           NA    NA NA     
3 Name3   ID3             3 NA           NA    NA NA     
4 Name4   ID4             4 ID4           8    13 NA     
5 Name5   NA             NA ID5           5    10 NA     
6 Name6   NA             NA ID6           6    11 NA     
7 Name7   NA             NA ID7           7    12 NA   

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2016-10-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2022-09-22
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多