基于R中的多个列合并两个数据帧

时间:2020-01-30 13:56:55

标签: r merge dplyr frame

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

数据帧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 个答案:

答案 0 :(得分:1)

以下是实现目标的一种方法。您想将df2转换为长格式数据并获取具有多个字符的行。获得这些数据后,将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"))

答案 1 :(得分:0)

您也可以这样做:

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