Я пытаюсь оставить соединение между двумя таблицами data.tables, используя условие (например, доход> стоимость). Мне нужно это в data.table (а не в dplyr) из-за эффективности, поскольку я работаю с огромными наборами данных. Моя проблема в том, что когда я присоединяюсь, используя следующий код, мой столбец «доход» перезаписывается значениями столбца затрат.
Любое предложение исправить это поведение?
A <- data.table(ID=c(1,2,3,4),cost=c(1000,2000,3000,4000))
B <- data.table(income=c(1500,2500,3500,4500),name=c("A","B","C","D"))
#The output:
B[A,.(ID,cost,income,name),on=.(income>cost)
,allow.cartesian=TRUE
,nomatch=NULL]
#Expected output:
A <- A %>% mutate(ID_j=1)
B <- B %>% mutate(ID_j=1)
A %>%
left_join(B) %>%
as.data.frame() %>%
filter(cost<income) %>%
select(-ID_j)
Использовал разные библиотеки, но мне нужно заставить его работать с data.table.
У нас есть 4 строки в одном столбце и 4 в другом, объединение всех A со всеми B даст фрейм данных из 16 строк (4x4). Затем я фильтрую, чтобы иметь только строки, в которых доход в B больше, чем стоимость в A, поэтому в результате получается 10 строк. Если я сделаю это с помощью data.table, результатом будет 10 строк, но столбец будет перезаписан, а стоимость и доход столбцов будут точно такими же.
Это выполнит аспект перекрестного соединения (заполните 16 строк) с использованием временного ключа (k), затем отфильтруйте и удалите столбец k:
res<-setkey(A[,c(k=1,.SD)],k)[B[,c(k=1,.SD)],allow.cartesian=TRUE][income>cost,-c("k")]
адаптировано из: Как сделать перекрестное соединение в R?
Это эффективно? Это похоже на простое объединение каждой строки с каждой строкой, без использования неравенства, чтобы не дать совпадений, а затем фильтрацию, верно?
Без понятия - определенно стоит проверить тайминги с большим набором данных. Можно включить сравнение/фильтрацию в момент первоначального соединения.
B[A, .(ID, cost, income = x.income, name), on = .(income > cost)]
Результаты
ID cost income name
1: 1 1000 1500 A
2: 1 1000 2500 B
3: 1 1000 3500 C
4: 1 1000 4500 D
5: 2 2000 2500 B
6: 2 2000 3500 C
7: 2 2000 4500 D
8: 3 3000 3500 C
9: 3 3000 4500 D
10: 4 4000 4500 D
так что, чтобы было ясно, соединение - это буквально все строки в текущем порядке строк?