Добавление и перезапись при объединении данных - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть три следующих кадра данных:

prim <- data.frame("t"=2007:2012,
                   "a"=1:6,
                   "b"=7:12)

secnd <- data.frame("t"=2012:2013,
                    "a"=c(5, 7))

third <- data.frame("t"=2012:2013,
                    "b"=c(11, 13))

Я хочу объединить secnd и third в prim в два этапа. На первом этапе я присоединяюсь к prim и secnd, где любые существующие элементы в prim перезаписываются элементами в secnd, поэтому мы получаем:

     t  a  b
1 2007  1  7
2 2008  2  8
3 2009  3  9
4 2010  4 10
5 2011  5 11
6 2012  5 12
7 2013  7 NA

После этого я хочу присоединиться к third, где снова существующие элементы перезаписываются элементами в third:

     t  a  b
1 2007  1  7
2 2008  2  8
3 2009  3  9
4 2010  4 10
5 2011  5 11
6 2012  5 11
7 2013  7 13

Есть ли способ достичь этого, используя dplyr или базу R?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Не очень красиво. Но, похоже, делает работу

prim %>% 
  anti_join(secnd, by = "t") %>% 
  full_join(secnd, by = c("t", "a")) %>% 
  select(-b) %>% 
  left_join(prim %>% 
      anti_join(third, by = "t") %>% 
      full_join(third, by = c("t", "b")) %>% 
      select(-a))

дает

     t a  b
1 2007 1  7
2 2008 2  8
3 2009 3  9
4 2010 4 10
5 2011 5 11
6 2012 5 11
7 2013 7 13
0 голосов
/ 02 ноября 2018

Рассмотрим базу R с цепочкой merge и ifelse вызовов с последующей окончательной очисткой столбца:

final_df <- Reduce(function(x, y) merge(x, y, by="t", all=TRUE), list(prim, secnd, third))

final_df <- within(final_df, {
                      a.x <- ifelse(is.na(a.y), a.x, a.y)
                      b.x <- ifelse(is.na(b.y), b.x, b.y)      
                   })

final_df <- setNames(final_df[,1:3], c("t", "a", "b"))
final_df
#      t a  b
# 1 2007 1  7
# 2 2008 2  8
# 3 2009 3  9
# 4 2010 4 10
# 5 2011 5 11
# 6 2012 5 11
# 7 2013 7 13
0 голосов
/ 02 ноября 2018

Используя dplyr, вы можете сделать:

require(dplyr)

prim %>% full_join(secnd, by = 't') %>%
  full_join(third, by = 't') %>%
  mutate(a = coalesce(as.integer(a.y),a.x),
         b = coalesce(as.integer(b.y),b.x)) %>%
  select(t,a,b)

Я добавил функцию as.integer, поскольку у вас в данных есть разные типы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...