Объединить два фрейма данных на основе нескольких столбцов в R - PullRequest
1 голос
/ 30 января 2020

У меня есть два фрейма данных, выглядящих так:

фрейм данных 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. Так что, если это JKIO в PX2. появляется в 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)

?

Ответы [ 2 ]

1 голос
/ 30 января 2020

Ниже приведен один из способов достижения вашей цели. Вы хотите преобразовать 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

DATA

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"))
0 голосов
/ 30 января 2020

Вы также можете просто сделать:

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