Tengo dos data.tables (a y b) usando R que son aproximadamente 10,000 filas cada una. Cada data.table contiene tres columnas, x, y y z. Los valores z son únicos en cada data.table. Cada data.table comparte una cantidad de valores xey idénticos. Lo que necesito hacer es crear un nuevo data.table (c) que contenga solo las filas de a, donde los valores de x e y son idénticos a los de b.

Aquí hay un ejemplo de lo que necesito lograr.

Tabla de datos a

x    y      z
a    1    100
a    6    120
c    5    234
b    3    567
d    8    645
f    7    487

Tabla de datos b

x    y     z
a    1    904
b    6    120
c    7    765
e    3    567
d    8    329
a    0    638

Y la tabla de datos c (la tabla de datos recién creada) debería verse así

x    y     z
a    1    100
d    8    645

He mirado aquí (Valores coincidentes entre marcos de datos basados en la superposición fechas), pero no me llevó a donde necesitaba estar.

Aquí está el código para generar el ejemplo 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)

Encantado de tomar una sugerencia que utiliza data.frames tradicional

Gracias

0
A.Benson 10 sep. 2018 a las 06:16

3 respuestas

La mejor respuesta

Un simple merge lo hará:

merge(a, b, by=c("x","y"))

De manera predeterminada, merge mantiene solo filas de ambos conjuntos de datos donde hay una coincidencia; puede cambiar este comportamiento con los argumentos all, all.x y all.y, pero aquí no es necesario.

Si no desea los valores z de la tabla de datos b, haga lo siguiente:

merge(a, b[,.(x,y)], by=c("x","y"))
2
Dan Y 10 sep. 2018 a las 03:41

Tratar:

# 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]
0
nghauran 10 sep. 2018 a las 04:00

Alternativamente, un enfoque dplyr:

library(dplyr)
c <- a %>% semi_join(b, by = c("x", "y"))

> c
  x y   z
1 a 1 100
2 d 8 645
0
Jon Spring 10 sep. 2018 a las 03:47