2016-04-20 3 views
1

У меня есть два блока данных df1 и df2. df1> df2 размер.Нужно сравнить два фрейма данных различной длины и обновить столбец одного из фреймов данных на основе критериев соответствия в r

df1 -> A  B  C  D  E F 
     1 4-23-2015 abc dcv 0 0 
     2 5-23-2015 abc dcvm 1 0 
     3 4-24-2015 ab dcv  0 0 
     4 4-23-2014 abc dcv  0 0 

df2 -> A  B   C  D  E F 
     1 4-23-2015 abc dcv 0 0 
     3 4-24-2015 abc dcv 0 0 
     9 4-23-2015 abc dcv 0 0 

Теперь я хочу, чтобы сравнить

df1$A with df2$A and df1$B with df2$B and when it is true then put df1$F =1. So my output for the above example will be 

    df1 -> A  B  C  D  E F 
     1 4-23-2015 abc dcv 0 1 
     2 5-23-2015 abc dcvm 1 0 
     3 4-24-2015 ab dcv  0 1 
     4 4-23-2014 abc dcv  0 0 

Столбец B представляет собой столбец даты типа, а также сравнение выполняется ряд против ряда.

+0

Пожалуйста, укажите пример ввода или подробный анализ - сравниваете ли вы данные по индексу (row2 vs row2) и что делать с не сопоставимыми (больше записей прав df1?) –

+0

yes ... row vs row ... ..Ничего делать с несопоставимыми .... – tanay

+1

Вы можете просто выполнить 'merge (df1, df2, by = c (" A "," B "), all.x = TRUE)', чтобы увидеть, какие строки были соответствует. –

ответ

3

Это почти обычный merge боян, но и для более чистого производства и повышения производительности, я хотел бы предложить data.table бинарные левое соединение с Simultanious обновления по ссылке. Что-то вроде

library(data.table) 
setDT(df1)[df2, F := 1L, on = c("A", "B")] 
df1 
# A   B C D E F 
# 1: 1 4-23-2015 abc dcv 0 1 
# 2: 2 5-23-2015 abc dcvm 1 0 
# 3: 3 4-24-2015 ab dcv 0 1 
# 4: 4 4-23-2014 abc dcv 0 0 

В противном случае, простой merge(df1, df2, by = c("A", "B"), all.x = TRUE) покажет вам, какие были совпавшие строки, но вам нужно будет удалить ненужные столбцы и обновлять F соответственно.

+0

Это сработало..у вас ... Для обучения меня новым способом. – tanay

+1

@tanay см. [Здесь] (https://github.com/Rdatatable/data.table/wiki/Getting-started) для некоторых учебные пособия. –

1

Основываясь на вашем примере,

df1$F[apply(df1[,c('A', 'B')], 1, paste, collapse = '') %in% apply(df2[,c('A', 'B')], 1, paste, collapse = '')] <- 1 
df1 
# A   B C D E F 
#1 1 4-23-2015 abc dcv 0 1 
#2 2 5-23-2015 abc dcvm 1 0 
#3 3 4-24-2015 ab dcv 0 1 
#4 4 4-23-2014 abc dcv 0 0 
Смежные вопросы