2015-08-04 3 views
3

Предположим, у меня есть два разных набора данных Data1 и Data2. Для каждой записи в Data1$Incidents я хочу найти строки в Data2$Incidents, которые соответствуют ей, а также отслеживать записи, не имеющие совпадений. Затем я сохраняю записи, которые соответствуют новому кадру данных Data1_Matches. Теперь для каждой записи в Data2$Incidents Я ищу записи в Data1_Matches$Incidents, которые соответствуют, а затем создают аналогичный фрейм данных Data2_Matches.Избегание цикла for в R

Пусть ради аргумента моих наборов данных выглядит следующим образом:

Day Incidents 
"Monday" 30 
"Friday" 11 
"Sunday" 27 

Мой алгоритм на данный момент выглядит следующим образом:

Data1_Incs = as.integer(Data1$Incidents) 
LEN1  = length(Data1_Incs) 
No_Match = 0 

for (k in 1:LEN1){ 
    Incs = which(Data2$Incidents == Data1_Incs[k]) 
    if (length(Incs) == 0){ 
    No_Match = c(No_Match,k) 
    } 
} 
No_Match = No_Match[-1] 

Data1_Match <- Data1[-No_Match,] 
Data1_No_Match <- Data1[ No_Match,] 

Data2_Incs = Data2$Incidents 
LEN2  = length(Data2_Incs) 
Un_Match = 0 

for (j in 1:LEN2){ 
    Incs = which(as.integer(Data1_Match$Incidents) == Data2_Incs[j]) 
    if (length(Incs) == 0){ 
    Un_Match = c(Un_Match, j) 
    } 
} 
Un_Match = Un_Match[-1] 

Data2_Match <- Data2[-Un_Match,] 
Data2_No_Match <- Data2[ Un_Match,] 

Что такое лучший способ для меня выполнить эту задачу, не используя цикл for? Для справки Data1 имеет около 15 000 записей, а Data2 имеет более двух миллионов.

+4

Если вы предоставляете небольшой, автономный образец каждого набора данных, это будет намного легче помочь –

+0

Совпадает в каком смысле? Весь ряд идентичен? Или вы используете столбец или набор столбцов в качестве ключа? – ulfelder

+0

@ulfelder Образец данных, который я дал, не удивительно, но я имею в виду соответствие в этом смысле: для каждой строки в «Data1» я ищу, есть ли запись в «Data2 $ Incidents», которая соответствует этой отдельной записи из 'Data1'. Если совпадения нет, я сохраняю индекс, чтобы я мог делить «Data1» на два следующих набора данных: один со спичками и один без совпадений. – Mnifldz

ответ

3

Попробуйте использовать setdiff.

я Виль продемонстрировать на первый цикл:

No_Match <- setdiff(unique(Data2$Incidents), unique(Data1$Incidents)) 

Не уверен, что это вполне удовлетворяет вашим требованиям.

+0

. По-видимому, мне не нужен цикл for с использованием 'setdiff', поскольку он дать мне (уникальные) записи в 'Data2 $ Incidents', не содержащиеся в' Data1 $ Incidents', правильно? Если да, то как я подмножу «Data1», чтобы содержать только те инциденты, которые не содержатся в «No_Match»? – Mnifldz

+0

Это даст вам фактические значения и, следовательно, устранит дополнительный шаг получения подмножеств, а затем подмножество набора данных. – Michal

+0

Спасибо! 'setdiff' был тем, что мне нужно. Я смог полностью удалить циклы for, и мой скрипт работает довольно быстро. – Mnifldz

Смежные вопросы