2016-05-11 3 views
2

У меня есть два больших набора данных. Один из них старый, а второй - тот же, что и первый. Разница в том, что вторая имеет новые строки, обновленные Value и недостающие строки по сравнению с первым набором данных. Я хотел бы сохранить все в новом наборе данных и заполнить его недостающими строками (комбинации Date и Code), которые присутствуют в старом наборе данных. Порядок не важен.Заполнение отсутствующих строк двумя кадрами данных

Старый набор данных:

   Date Code Value 
     2015-10-01 1 145 
     2015-10-01 1 175 
     2015-11-01 6 112 
     2015-12-01 2 160 
     2016-01-01 6 124 
     2016-01-01 6 572 
     2016-02-01 5 160 
     2016-02-01 1 574 

Новый набор данных:

   Date Code Value 
     2015-10-01 1 145 
     2015-10-01 2 1452 
     2015-11-01 6 125 
     2015-12-01 2 160 
     2016-01-01 6 1501 
     2016-01-01 6 572 
     2016-03-01 9 452 
     2016-03-01 7 500 

Выход:

   Date Code Value 
     2015-10-01 1 145 
     2015-10-01 2 1452 
     2015-11-01 6 125 
     2015-12-01 2 160 
     2016-01-01 6 1501 
     2016-01-01 6 572 
     2016-03-01 9 452 
     2016-03-01 7 500 
     2015-10-01 1 175 
     2016-02-01 5 160 
     2016-02-01 1 574 

Когда нет соответствия комбинации Date и Code соответствующей строки из старый набор данных. На выходе последние три строки поступают из старого набора данных. Я смотрел на разные должности без удачи, чтобы найти то, что мне нужно.

ответ

0

Вы можете использовать функцию anti_join из библиотеки dplyr найти все строки в old_df, которые не существуют в new_df

df <- anti_join(old_df,new_df,by=c("date","code","value")) 
     date code value 
1 2016-01-01 6 124 
2 2016-02-01 1 574 
3 2016-02-01 5 160 
4 2015-10-01 1 175 
5 2015-11-01 6 112 
final_df <- full_join(df,new_df,by=c("date","code","value")) 
     date code value 
1 2016-01-01 6 124 
2 2016-02-01 1 574 
3 2016-02-01 5 160 
4 2015-10-01 1 175 
5 2015-11-01 6 112 
6 2015-10-01 1 145 
7 2015-10-01 2 1452 
8 2015-11-01 6 125 
9 2015-12-01 2 160 
10 2016-01-01 6 1501 
11 2016-01-01 6 572 
12 2016-03-01 9 452 
13 2016-03-01 7 500 
+0

'final_df <- anti_join (oldds, newds, by = c (« Дата »,« Код »))' почти работает, но не обнаруживает эта строка '2015-10-01 1 175', где только «Код» изменился. Более того, я получаю это предупреждающее сообщение «объединение факторов с разными уровнями, принуждение к символьному вектору» – noblabla

+0

Хорошо, я понимаю, что я сделал. во-первых, anti_join возвращает часть ответа. Я отредактирую свой ответ. – theArun

+0

Причина, по которой вы получаете предупреждение, связана с тем, что ваш столбец даты может быть установлен в качестве факторов, которые вы можете изменить, используя мое as.character() в столбцах даты – theArun

1

Вы можете сделать это

key.new <- with(newds, interaction(Date, Code, Value)) 
key.old <- with(oldds, interaction(Date, Code, Value)) 

затем

ind <- match(key.old, key.new, nomatch=0) == 0 

дает вам строки из старого набора данных, которые должны быть добавлены к новому один, если я понимаю вопрос правильно.

> oldds[ind, ] 
     Date Code Value 
2 2015-10-01 1 175 
3 2015-11-01 6 112 
5 2016-01-01 6 124 
7 2016-02-01 5 160 
8 2016-02-01 1 574 

Как в стороне записки, это рекомендуется обеспечить минимальный воспроизводимый пример, в том числе команды, чтобы восстановить данные, которые вы работаете с, например, выход dput(oldds) и dput(newds) или

oldds <- 
read.table(text=' 
      Date Code Value 
    2015-10-01 1 145 
    2015-10-01 1 175 
    2015-11-01 6 112 
    2015-12-01 2 160 
    2016-01-01 6 124 
    2016-01-01 6 572 
    2016-02-01 5 160 
    2016-02-01 1 574 
', header=TRUE) 

newds <- 
read.table(text=' 
      Date Code Value 
    2015-10-01 1 145 
    2015-10-01 2 1452 
    2015-11-01 6 125 
    2015-12-01 2 160 
    2016-01-01 6 1501 
    2016-01-01 6 572 
    2016-03-01 9 452 
    2016-03-01 7 500 
', header=TRUE) 
+1

Да, значения в строки 3 и 5 были обновлены в новом наборе данных и должны быть сохранены. – noblabla