Объединение двух data.frames с использованием вспомогательных data.frame dplyr R - PullRequest
0 голосов
/ 24 октября 2018

Я хотел бы объединить два data.frames, используя третий data.frame matches, который дает ключ к тому, как следует объединить два предыдущих (id и number - совпадающие ключи. Class всегда должен бытьсовпадение и служит дополнительной проверкой).df2 следует объединить с df1, заменив столбцы с одинаковыми именами и вставив переменные из df2 в соответствующие строки в df1 (в этом примере эти строки будут иметь оценку, но в моих реальных примерах это около 20+ столбцовэто должно быть заменено из 30 или около того (оставшиеся 10 останутся прежними). ​​Я надеюсь, что это ясно и заранее большое спасибо за помощь, как сделать это эффективно. Это должно быть left_join, поскольку я хотел бы сохранить всезаписи в df1. dplyr предпочтительнее!

df1 <- data.frame(1:10,
                  c("a","b","a","b","c","c","b","a","b","c"),
                  seq(20,38,2),
                  dnorm(10,5,2),
                  rnorm(10,78,5))
colnames(df1) <- c("id","class","score","misc","hc")
df2 <- data.frame(11:19,
                  c("g","d","a","e","c","d","f","a","b"),
                  seq(40,48,1),
                  dnorm(9,6,1),
                  rnorm(9,45,3))
colnames(df2) <- c("number","class","score","other","md")

matches <- data.frame(c("b","a","c","a"),
                      c(4,1,5,8),
                      c(19,18,15,13))
colnames(matches) <- c("class","id","number")

library(dplyr)

Ожидаемый результат:

id class          misc       hc number   score       other       md
 1     a    0.00876415 70.85210     18      47 0.004431848 40.99189
 2     b    0.00876415 81.27802     22      22          NA       NA
 3     a    0.00876415 69.19300     24      24          NA       NA
 4     b    0.00876415 75.86247     19      48 0.004431848 44.78242
 5     c    0.00876415 69.18268     15      44 0.004431848 42.70708
 6     c    0.00876415 80.49475     30      30          NA       NA
 7     b    0.00876415 76.52195     32      32          NA       NA
 8     a    0.00876415 73.52712     13      42 0.004431848 45.69842
 9     b    0.00876415 81.50631     36      36          NA       NA
10     c    0.00876415 80.55145     38      38          NA       NA

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Использование dplyr

library(dplyr) 
df1 %>% left_join(matches,by=c('id','class'),suffix=c('.df1','.df2')) %>%
        left_join(df2,by=c('class','number'),suffix=c('.df1','.df2')) %>% 
        mutate(score=if_else(!is.na(score.df2),score.df2,score.df1)) %>% 
        select(-score.df1,score.df2)
0 голосов
/ 24 октября 2018

Просто сделайте два слияния вот так:

tmp = merge(df1, matches, all.x = FALSE, all.y = TRUE)
res = merge(tmp, df2, all.x = TRUE, all.y = FALSE)
res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...