首页 > 解决方案 > 基于R中的多列合并两个数据框

问题描述

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

数据框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 PX 和 df2 PX1,PX2,PX3,PX4 的两个数据文件。因此,如果它是 PX2 中的 JKIO。出现在 PX 中,然后将它们合并到同一行 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)

?

标签: rmergedplyrframe

解决方案


以下是实现目标的一种方法。您想要转换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"))

推荐阅读