Complicado título, pero aquí es un simple ejemplo de lo que estoy tratando de lograr:

d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), 
                v2 = c("A","E","C","B","B","C","A","E"))

m <- data.frame(v3 = c("D","E","A","C","D","B"), 
                v4 = c("d","e","a","c","d","b"))

Valores en d$v2 debe ser reemplazado por los valores en m$v4 por la coincidencia de los valores de d$v2 en m$v3

Los datos resultantes marco d debe verse como:

v1    v4
1      a
2      e
3      c
4      b
5      b
6      c
7      a
8      e

He probado diferentes cosas y lo más cercano que llegó fue: d$v2 <- m$v4[which(m$v3 %in% d$v2)]

Yo trato de evitar cualquier para bucles de nuevo! Debe ser posible 🙂 de alguna manera… 😉

InformationsquelleAutor user969113 | 2012-07-17

3 Comentarios

  1. 18

    Puedes intentar:

    merge(d,m, by.x="v2", by.y="v3")
      v2 v1 v4
    1  A  1  a
    2  A  7  a
    3  B  4  b
    4  B  5  b
    5  C  3  c
    6  C  6  c
    7  E  2  e
    8  E  8  e

    Editar

    Aquí es otro enfoque, para preservar el orden:

    data.frame(v1=d$v1, v4=m[match(d$v2, m$v3), 2])
      v1 v4
    1  1  a
    2  2  e
    3  3  c
    4  4  b
    5  5  b
    6  6  c
    7  7  a
    8  8  e
    • Traté de combinar, pero cambia el orden y quiero mantener el orden de la trama de datos d. Podría, por supuesto, agregar una columna «orden» a d primero y después de aplicar la mezcla resort en esa columna, pero luego tengo que caer de nuevo. Es un poco más de la parte superior, supongo, ¿no?
    • He añadido otra versión.
    • sí coinciden hace el trabajo! fantástico. el resto es fácil de entender. hay muchas de estas cosas como match which %in% is.element etc, y también las muchas combinaciones que a veces es sólo difícil de encontrar la correcta.. umm 🙂
    • La segunda solución por johannes trabajado, no es lo que yo quería aún mejor que combinar.
  2. 9

    Usted podría utilizar un estándar de left join.

    La carga de los datos:

    d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), v2 = c("A","E","C","B","B","C","A","E"), stringsAsFactors=F)
    m <- data.frame(v3 = c("D","E","A","C","D","B"), v4 = c("d","e","a","c","d","b"), stringsAsFactors=F)

    El cambio de nombre de la columna, de tal manera que me pueden unirse por la columna «v2»

    colnames(m) <- c("v2", "v4")

    A la izquierda de unirse y mantener el orden de los datos.marco d

    library(dplyr)
    left_join(d, m)

    De salida:

      v1 v2 v4
    1  1  A  a
    2  2  E  e
    3  3  C  c
    4  4  B  b
    5  5  B  b
    6  6  C  c
    7  7  A  a
    8  8  E  e
  3. 0

    Esto le dará el resultado deseado:

    d$v2 <- m$v4[match(d$v2, m$v3)]

    función coincidir devuelve la posición de la m de matrix v3 columna para los valores en d$v2 ser correspondidos. Una vez que se han obtenido los índices (de uso match()), los elementos de acceso de m$v4 el uso de los índices para reemplazar los elementos de d matriz columna v2.

Dejar respuesta

Please enter your comment!
Please enter your name here