Quantcast
Channel: Identificar registros por el ID - Stack Overflow en español
Viewing all articles
Browse latest Browse all 4

Identificar registros por el ID

$
0
0

Esta pregunta se me ha hecho un poco larga, pero en realidad creo que es fácil (para el que sepa)

Tengo 3 df

d1=data.frame(Modelo = sample(c("ModeloA","ModeloB","ModeloC","ModeloD"), 20, replace=TRUE),              Color = sample(c("ColorA","ColorB","ColorC"), 20, replace=TRUE),              Distancia = sample(100:300, 20, replace=TRUE),              Id=1:20)d2=data.frame(Modelo = sample(c("ModeloD","ModeloB","ModeloE","ModeloD"), 30, replace=TRUE),              Color = sample(c("ColorA","ColorF","ColorC"), 30, replace=TRUE),              Distancia = sample(120:260, 30, replace=TRUE),              Id=1:30)d3=data.frame(Modelo = sample(c("ModeloA","ModeloB","ModeloD"), 20, replace=TRUE),              Color = sample(c("ColorA","ColorB","ColorC","ColorD"), 20, replace=TRUE),              Distancia = sample(120:200, 20, replace=TRUE),              Id=1:20)

Quiero identificar los registros que coincidan en las 3 bases y que me indique en que ID está de cada base (filtrando los datos según cierta distancia)

Primero unifico los 3 df

col<-c("Modelo", "Color")
  • Unifico df1 con df2

    d1 %>% inner_join(d2,by=col, suffix=c(".d1", ".d2"))-> d1_2
  • Unifico df1_2 con df3

    d1_2 %>% inner_join(d3,by=col) -> d12_3

Renombro el ID para dejar claro que es el id3. (No consigo que se cambie en el paso anterior)

d12_3 <-rename(d12_3, c("Id.d3"="Id"))

Ya tengo los 3df unificados en uno solo.

Ahora, partiendo de la columna Distancia, los datos que están a una distancia entre sí de más de 100 con respecto a cualquier de los otros los descarto.

Para compararlos, lo que se me ha ocurrido es buscar la distancia mínima e ir comparando cada df con esa distancia mínima. Si esta a más de 100 lo descarto.Lo mismo hay una manera mejor de hacerlo.

Distancia mínima

d12_3$min<-apply(d12_3[, c("Distancia.d1","Distancia.d2","Distancia")], 1, min)

Si la distancia de cada df está a más de 100 descarto ese registro.

d12_3[abs(d12_3[,"Distancia.d1"]-d12_3[,"min"])<=100,]->d12_3d12_3[abs(d12_3[,"Distancia.d2"]-d12_3[,"min"])<=100,]->d12_3d12_3[abs(d12_3[,"Distancia"]-d12_3[,"min"])<=100,]->d12_3

Ahora como sé que todos los datos están a menos de 100, la variable distancia ya no me importa. Me quedo con modelo y color.

Obtener el ID

Quiero obtener en que id de cada df está cada registro.

Algo como esto

Modelo      Color        id.d1        id.d2          id.d3ModeloD      ColorC       2        6,7,12,15...        14,17

El modeloD con colorc es el registro 2 en el df1, que coindice con los registros 6,7,12... del df2 que coincide con los registros 14,17 del df3.

Supongo que hay que agrupar y luego aplicar dos summarise para sacar los id, pero no lo consigo.


Viewing all articles
Browse latest Browse all 4

Latest Images



Latest Images