Использование data.table
Код
df1[, DF2ID := lapply(ID, function(x){
ind = nrow(df2) + 1 - sum(x + 1000 <= df2[, ID])
return(df2[ind, ID])
})]
df1[, value := sapply(DF2ID, function(x){
df2[which(ID == x), Value]
})]
Результат
> df1
ID DF2ID value
1: 3000 4010 4
2: 4000 5000 5
3: 5000 6000 6
4: 6000 7000 7
Данные
df1 = data.table(ID = seq(3000, 6000, 1000))
df2 = data.table(ID = c(3000, 3010, 3020, 4010, 5000, 6000, 7000),
Value = seq(1:7))
Я предполагаю, что комментарий Джонни Фелпа относительно value
является правильным. В противном случае это легко исправить во второй строке кода. Кроме того, безусловно, существует более элегантный способ простого извлечения ind
из первого оператора lapply для получения value
.
Edit: следующая процедура, возможно, более элегантна:
df1 = data.table(ID_df1 = seq(3000, 6000, 1000))
df2 = data.table(ID_df2 = c(3000, 3010, 3020, 4010, 5000, 6000, 7000),
Value = seq(1:7))
df1[, Value := sapply(ID_df1, function(x){
nrow(df2) + 1 - sum(x + 1000 <= df2[, ID_df2])
})]
df_master = merge(df1, df2, by = 'Value')
> df_master
Value ID_df1 ID_df2
1: 4 3000 4010
2: 5 4000 5000
3: 6 5000 6000
4: 7 6000 7000