У меня есть два data.tables
(a и b) с использованием R, каждый из которых составляет около 10 000 строк. Каждый data.table
содержит три столбца x, y и z. Значения z уникальны в каждом data.table
. Каждый data.table
имеет несколько одинаковых значений x и y. Что мне нужно сделать, так это создать новый data.table
(c), который содержит только строки из a, где значения x и y идентичны значениям в b.
Вот пример того, чего мне нужно добиться.
таблица данных a
x y z
a 1 100
a 6 120
c 5 234
b 3 567
d 8 645
f 7 487
таблица данных b
x y z
a 1 904
b 6 120
c 7 765
e 3 567
d 8 329
a 0 638
И таблица данных c (вновь созданная таблица данных) должна выглядеть так
x y z
a 1 100
d 8 645
Я посмотрел здесь (Сопоставление значений между фреймами данных на основе перекрывающихся дат), но это не совсем привело меня туда, где мне нужно было быть.
Вот код для создания примера data.tables
.
library(data.table)
x<-c("a","a","c","b","d","f")
y<-c(1,6,5,3,8,7)
z<-c(100,120,234,567,645,487)
a<-data.frame(x,y,z)
rm(x,y,z)
x<-c("a","b","c","e","d","a")
y<-c(1,6,7,3,8,0)
z<-c(904,120,765,567,329,638)
b<-data.frame(x,y,z)
setDT(a)
setDT(b)
Рад принять предложение, в котором используется традиционный data.frames
Спасибо
Простой merge
сделает это:
merge(a, b, by=c("x","y"))
По умолчанию merge
сохраняет только строки из обоих наборов данных, в которых есть совпадения; вы можете изменить это поведение с помощью аргументов all
, all.x
и all.y
, но здесь в этом нет необходимости.
Если вам не нужны значения z
из b
с данными, сделайте следующее:
merge(a, b[,.(x,y)], by=c("x","y"))
Пытаться:
# Note that they should be different values of z for identical x and y
# The following options assume that you also want to keep this information i.e. z values
# from a and b for matched columns x and y
dplyr::inner_join(a, b, by = c("x", "y")) # option 1
merge(a, b, by = c("x","y")) # option 2
# option 3 using DT
setkeyv(a, c("x","y"))
setkeyv(b, c("x","y"))
a[b, nomatch = 0]
В качестве альтернативы подход dplyr
:
library(dplyr)
c <- a %>% semi_join(b, by = c("x", "y"))
> c
x y z
1 a 1 100
2 d 8 645