2015-09-10 2 views
2

У меня есть два data.frames, lookup_df и values_df. Для каждой строки в lookup_df я хочу найти ближайшее значение в values_df, которое меньше или равно значению индекса.R Поиск ближайшего значения в data.frame меньше, чем другое значение

Вот мой код до сих пор:

lookup_df <- data.frame(ids = 1:10) 
values_df <- data.frame(idx = c(1,3,7), values = c(6,2,8)) 

Что я хотел для result_df является следующее:

> result_df 
    ids values 
1 1  6 
2 2  6 
3 3  2 
4 4  2 
5 5  2 
6 6  2 
7 7  8 
8 8  8 
9 9  8 
10 10  8 

Я знаю, как сделать это с помощью SQL довольно легко, но я Любопытно, если есть R-путь, который прост. Я мог бы итерации строк lookup_df, а затем цикл через строки values_df, но это не является эффективным с точки зрения вычислений. Я открыт для использования библиотеки dplyr, если кто-то знает, как использовать ее для решения проблемы.

ответ

2

Если values_df отсортирован по возрастанию idx, то findInterval будет работать:

lookup_df <- data.frame(ids = 1:10) 
values_df <- data.frame(idx = c(1,3,7), values = c(6,2,8)) 
lookup_df$values <- values_df$values[findInterval(lookup_df$ids,values_df$idx)] 
lookup_df 

> ids values 
1 1  6 
2 2  6 
3 3  2 
4 4  2 
5 5  2 
6 6  2 
7 7  8 
8 8  8 
9 9  8 
10 10  8 
+0

Brilliant, это должно аккуратно покрыть '<= index' требование. – thelatemail

+0

Удивительный! Очень признателен. Я использую dplyr сильно, поэтому тот факт, что это не зависит от пакета data.table, является полезным. –

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