【问题标题】:Merge two data frames based on multiple columns in R基于R中的多列合并两个数据框
【发布时间】:2020-01-30 13:56:55
【问题描述】:

我有两个看起来像这样的数据框

数据框 1:

P.X    value
OOPA     5
POKA    4
JKIO    3
KOPP    1 

数据框 2:

P.X.1   P.X.2   P.X.3  P.X.4    mass
        JKIO    UIX    HOP       56
                CX     OOPA      44
EDD             POKA             13
KOPP    FOSI                     11 

我想合并基于 df1 P.X 和 df2 P.X.1,P.X.2,P.X.3,P.X.4 的两个数据文件。因此,如果它是 P.X.2 中的 JKIO。出现在 P.X 中,然后将它们合并到同一行 JKIO, 3, 56 中的新数据框中,如下所示:

新数据框:

P.X    value  mass
OOPA    5      44
POKA    4      13
JKIO    3      56
KOPP    1      11 

你知道我该怎么做吗

merge(df1,df2 by(P.X == P.X.1 | P.X.2 | P.X.3 | P.X.4)

?

【问题讨论】:

  • 在数据框 2 中,您有空白单元格。他们真的是空白吗?或者你有 NA?
  • 是的,我有,它们是空白的

标签: r merge dplyr frame


【解决方案1】:

以下是实现目标的一种方法。您想将 df2 转换为长格式数据并获取超过 1 个字符的行。获得这些数据后,将 df1 与更新后的 df2 合并。

library(dplyr)
library(tidyr)

left_join(df1,
          pivot_longer(df2, cols = P.X.1:P.X.4, names_to = "foo",
                       values_to = "P.X") %>% filter(nchar(P.X) > 0),
          by = "P.X") %>% 
select(-foo)

   P.X value mass
1 OOPA     5   44
2 POKA     4   13
3 JKIO     3   56
4 KOPP     1   11

数据

df1 <- structure(list(P.X = c("OOPA", "POKA", "JKIO", "KOPP"), value = c(5L, 
4L, 3L, 1L)), class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(P.X.1 = c("", "", "EDD", "KOPP"), P.X.2 = c("JKIO", 
"", "", "FOSI"), P.X.3 = c("UIX", "CX", "POKA", ""), P.X.4 = c("HOP", 
"OOPA", "", ""), mass = c(56, 44, 13, 11)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

【讨论】:

  • 抱歉我改变了我的问题,因为我意识到我没有彻底表达自己。
  • @user12237608 我正在阅读您的更新。我很高兴我的代码对你有用。
【解决方案2】:

你也可以这样做:

 df_new <- cbind(df1, df2[,5])

【讨论】:

  • df2[,5] 是什么意思?
  • 表示只选择nr列。 5 来自df2。您可以通过使用方括号 [ ] 对对象进行子集化来处理行和列。行在逗号前面,列在逗号后面。例如,通过运行df1[3,2],它将返回值 3,因为这是存储在df1 中第 3 行第 2 列的值。
  • @veghokstvd 这适用于这个例子,但假设 df2 有 40 列,合并这两个 df 会很长
  • @bretauv 那么你可以做df_new &lt;- cbind(df1, df2[,5:40])
  • @veghokstvd 真实
猜你喜欢
  • 1970-01-01
  • 2018-01-30
  • 2020-07-17
  • 2019-05-01
  • 2015-01-17
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多