Объединение фреймов данных в dplyr по символам - PullRequest
1 голос
/ 17 июня 2020

Итак, у меня есть два фрейма данных:

DF1

X          Y    ID
banana     14   1
orange     20   2
pineapple  1    3
guava      300  4
grapes     1    5

DF2

Store      State   ID
Walmart    NY      1
Sears      AL      1;2
Target     DC      3
Old Navy   PA      3
Popeye's   HA      5
Footlocker NJ      4;5

Я присоединяюсь к следующему и получаю:

df1 %>% 
  inner_join(df2, by = "ID")

X          Y    ID    Store      State
banana     14   1     Walmart    NY
pineapple  1    3     Target     DC
pineapple  1    3     Old Navy   PA
grapes     1    5     Popeye's   HA

Но из-за точек с запятой я не захватываю эти точки данных при объединении, конечный результат должен выглядеть следующим образом:

X          Y    ID    Store       State
banana     14   1     Walmart     NY
banana     14   1     Sears       AL
orange     20   2     Sears       AL
pineapple  1    3     Target      DC
pineapple  1    3     Old Navy    PA
guava      300  4     Foot Locker NJ
grapes     1    5     Popeye's    HA
grapes     1    5     Popeye's    HA

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Использование separate_rows из tidyr в сочетании с dplyr приведет вас туда.

Первый стол я назвал фруктами, остальные магазины.

library(dplyr)
library(tidyr)


fruit %>% 
  inner_join(separate_rows(stores, ID) %>% mutate(ID = as.integer(ID)))

Joining, by = "ID"
          X   Y ID      Store State
1    banana  14  1    Walmart    NY
2    banana  14  1      Sears    AL
3    orange  20  2      Sears    AL
4 pineapple   1  3     Target    DC
5 pineapple   1  3   Old Navy    PA
6     guava 300  4 Footlocker    NJ
7    grapes   1  5   Popeye's    HA
8    grapes   1  5 Footlocker    NJ
1 голос
/ 17 июня 2020

С base R, мы можем использовать strsplit с merge

lst1 <- strsplit(DF2$ID, ";")
merge(DF1, transform(DF2[rep(seq_len(nrow(DF2)),
        lengths(lst1)), 1:2], ID = unlist(lst1)))
#   ID         X   Y      Store State
#1  1    banana  14    Walmart    NY
#2  1    banana  14      Sears    AL
#3  2    orange  20      Sears    AL
#4  3 pineapple   1     Target    DC
#5  3 pineapple   1   Old Navy    PA
#6  4     guava 300 Footlocker    NJ
#7  5    grapes   1   Popeye's    HA
#8  5    grapes   1 Footlocker    NJ
...