У меня есть две таблицы данных, которые я хочу сравнить в каждой строке и добавить новый столбец.
DT1 <- data.table(ID=c("F","A","E","B","C","D","C"),
num=c(59,3,108,11,22,54,241),
value=c(90,47,189,72,42,86,280))
DT2 <- data.table(Mark=c("Mary","Abner","Bonnie","Trista","Norman"),
numA=c(48,20,88,237,10),
numB=c(60,326,54,268,89),
valueA=c(78,34,78,270,60),
valueB=c(92,190,90,385,75))
Моя цель:
Я хочу найти число и значение в DT1, а в DT2 есть диапазон numA и numB.
Например:
Для строки F num = 59 и значения = 90 в DT1 также должны совпадать:
num(59) > DT2$numA(48) & num(59) < DT2$numB(60) & value(90) > DT2$valueA(78) & value(90) < DT2$valueB(92)
соответствовать! поэтому добавьте новый результат имени столбца, а значение - Mark by dt2
Если совпадения нет, установите для него значение Не определено.
Желаемый результат:
DT3 <- data.table(ID=c("F","A","E","B","C","D","C"),
num=c(59,3,108,11,22,54,241),
value=c(90,47,189,38,42,86,280),
result=c("Mary","Undefined","Abner","Norman",
"Abner","Abner","Trista"))
Как сделать так, чтобы в каждой строке было сравнение и добавить новый столбец?
Я думал об этой проблеме, но для моих исходных данных, похоже, все в порядке, если вы можете найти соответствующую информацию.





Опция data.table:
DT1[DT2, on=.(num > numA, num < numB, value > valueA, value < valueB), Mark := i.Mark]
DT1
ID num value Mark
1: F 59 90 Abner
2: A 3 47 <NA>
3: E 108 189 Abner
4: B 11 72 Norman
5: C 22 42 Abner
6: D 54 86 Abner
7: C 241 280 Trista
Спасибо, пробовал использовать :=, но безуспешно, может ваш способ, придется заново изучать data.table.
Я уверен, что это можно было бы решить более эффективно, используя одну из операций соединения в data.table, однако вот один базовый вариант R с использованием mapply
DT1$result <- mapply(function(x, y) {
inds <- x > DT2$numA & x < DT2$numB & y > DT2$valueA & x < DT2$valueB
if (any(inds))
DT2$Mark[which.max(inds)]
else "Undefined"
}, DT1$num, DT1$value)
DT1
# ID num value result
#1: F 59 90 Mary
#2: A 3 47 Undefined
#3: E 108 189 Abner
#4: B 11 72 Norman
#5: C 22 42 Abner
#6: D 54 86 Mary
#7: C 241 280 Trista
Как вы разрешаете конфликты? Когда есть более одного матча, какой из них вы берете? В настоящее время я беру первый матч.