Hola tengo dos conjunto de datos donde el primero es un conjunto de índice:

ind1<-rep(c("E","W"), times=20)
ind2<-sample(100:150, 40)
y<-c(1:40)
index<-data.frame(cbind(ind1, ind2, y))

El segundo conjunto de datos es la que uno necesita para ser indexado.

x1<-sample(c("E","W","N"), 40, replace=TRUE)
x2<-sample(100:150, 40)
x3<-rep(0, times=40)
data<-data.frame(cbind(x1,x2,x3))

Me gustaría indicar en x3 donde el x1 y x2 en data para ser comparados con ind1 y ind2 en index, respectivamente, y devolver el correspondiente y.

index1<-split(index, index$ind1)
data1<-split(data, data$x1)
data1$E$x3<-match(data1$E$x2, index1$E$ind2)
data1$W$x3<-match(data1$W$x2, index1$W$ind2)

Poco coincidía con la forma que yo quería, pero no volver y correctamente. Que parte de que hice mal?
Gracias.

También, hay una más rápida/más inteligente forma de hacerlo? Porque yo podría tener más condiciones para que coincida con. Originalmente traté de si la sentencia else, pero no funcionó.

OriginalEl autor lamushidi | 2013-08-19

3 Comentarios

  1. 5
    merge(data, index, by.x=c("ind1", "ind2"), by.y=c("x1", "x2"), all.x=TRUE, all.y=FALSE)

    le dará la x y y valores para cada uno de los combinación de ind1 y ind2, y x1 y x2. Todas las combinaciones de x1 y x2 se mantendrá (incluso si esa combinación de ind1 y ind2 no ocurre en la index, pero las combinaciones de ind1 y ind2 que no ocurren en data serán descartados. Como está escrito, de que la solución se mantenga x3 y y valores, pero si quieres colocar el y valores que puede utilizar merge(data[ ,-3], ... como por @Fernando.kraft sugerencia.

    Tal vez merge(data[,-3], index, by.y=c("ind1", "ind2"), by.x=c("x1", "x2"), all=TRUE)?
    Wow, gracias. Tal vez no he estado a mi pregunta con suficiente claridad. Tengo que mantener data como lo es la coincidencia de y según index.
    Yo creo que lo tengo. con @Drew Steen ‘s solución para obtener sólo el juego de las parejas. A continuación, utilice @Fernando.kraft ‘s solotion a la combinación de los pares coincidentes con data. Gracias a ambos. 😀
    Editado para reflejar @Fernando.kraft de punto – a pesar de que mi entendimiento es que ahora, OP quiere mantener todas las combinaciones de x1 y x2 en data, pero está bien soltar combinaciones de ind1 y ind2 que aparecen en index pero no en data.

    OriginalEl autor Drew Steen

  2. 3

    Hay muchas maneras de acercarse a este, y realmente depende de las características de los datos. Aquí es la forma más directa de coincidencia de criterio:

    Pegar: La ‘pasta’ función le permite crear una cadena de múltiples piezas de datos. Si usted es una correspondencia entre los conjuntos de datos utilizando las columnas que tienen coincidencias idénticas, usted puede simplemente pegar las columnas juntos y comparar directamente a través de un ‘match’ declaración, así:

    new_data <- data
    
    new_data$x3 <- ifelse(
        is.na(match(paste(data$x1, data$x2), paste(index$ind1, index$ind2))),
        0,
        index$y)

    El partido de la declaración de aquí se compara coincidencias exactas entre x1+x2 y ind1+ind2 pares y devuelve un entero que indica el índice par de ubicación corresponde a cada fila de datos. Si no encuentra ninguna coincidencia, NA es devuelto. Por la comprobación de NA en un ‘ifelse’ declaración, a continuación, escribir ceros para los valores de NA y devolver el correspondiente valor de y para cualquiera de los partidos.

    Agradezco! Que me salvó un montón de tiempo en el subconjunto!

    OriginalEl autor Dinre

  3. 1

    puede utilizar también left_join() de dplyr paquete:

    require(dplyr)
    left_join(data, index, by = c("x1" = "ind1", "x2" = "ind2"))    

    leer más aquí

    OriginalEl autor Woldemar G

Dejar respuesta

Please enter your comment!
Please enter your name here