2016-11-14 4 views
0

Я хотел бы ускорить мое решение в R.быстрее вложенным для контура R

Я получил два Dataframes, скажем: df_one:

A | B | C | D | same 
1 | 3 | 2 | 4 | NA 
6 | 5 | 1 | 3 | NA 
5 | 3 | 7 | 3 | NA 
3 | 4 | 8 | 3 | NA 

И df_two:

A | B 
1 | 3 
6 | 2 
5 | 3 

Если оба экземпляра в столбцах A и B одинаковы (или в последовательности .5), я хочу 1, иначе 0 в дополнительном столбце в df_one (df_one $ same).

Я сделал это с помощью следующего кода:

df_one$same <- NA 

for (i in 1:nrow(df_one)) { 
    for (j in 1:nrow(df_two)) { 
    distance <- seq(df_two[j, 2]-.5, df_two[j, 2]+.5, by = .1) 
    print(i) 
    if ((df_one[i, 1] == df_two[j, 1]) & (df_one[i, 2] %in% df_two[i, 2])){ 
     df_one[i, 5] <- 1 
     break} 
    else{df_one[i, 5] <- 0} 
    } 
} 

Может кто-нибудь помочь мне с более быстрым решением?

+1

Делают 'merge', а затем сравнить столбцы, то это будет намного быстрее, чем при использовании петли. – ytk

+0

Ваш код не воспроизводится, и ваше желаемое поведение неясно. 'hour_df' не определен, и неясно, что именно вы пытаетесь выполнить. См. [Здесь] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) для получения дополнительной информации о том, как написать хороший вопрос R –

ответ

4

Более быстрое решение, что я думаю, что вы просите, чтобы использовать left_join от dplyr и явно проверить на матчи.

left_join(df_one, df_two, by = "A") %>% 
    mutate(same = B.x == B.y) 

дает

A B.x C D same B.y 
1 1 3 2 4 TRUE 3 
2 6 5 1 3 FALSE 2 
3 5 3 7 3 TRUE 3 
4 3 4 8 3 NA NA 
Смежные вопросы