Pregunta

Nota: Me cambió el ejemplo de cuando por primera vez. Mi primer ejemplo se simplifica demasiado para capturar el verdadero problema.

Tengo dos tramas de datos que se clasifican de manera diferente en una columna. Quiero que coincida con una columna y luego fusionar en el valor de la segunda columna. La segunda columna debe permanecer en el mismo orden.

Así que tengo esto:

state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)

s1
s2

que devuelve la siguiente:

> s1
  state value1
1    IA      1
2    IA      2
3    IA      3
4    IL      4
5    IL      5
6    IL      6
> s2
  state value2
1    IL      3
2    IL      4
3    IL      5
4    IA      6
5    IA      7
6    IA      8

y quiero que esto:

  state value1 value2
1    IA      1      6
2    IA      2      7
3    IA      3      8
4    IL      4      3
5    IL      5      4
6    IL      6      5

Estoy a punto de conducir yo tonto tratar de resolver esto. Parece que debería ser un simple problema subíndice.

¿Fue útil?

Solución

Hay varias maneras de hacer esto (R es, después de todo), pero creo que lo más clara es la creación de un índice. Necesitamos una función que crea un índice secuencial (a partir de uno y terminando con el número de observaciones).

seq_len(3) 
> [1] 1 2 3

Sin embargo, tenemos que calcular este índice dentro de cada variable (estado) de agrupación. Para ello podemos utilizar la función de ave R. Se necesita un numérico como primer argumento, a continuación, los factores de agrupación, y finalmente la función para ser aplicado en cada grupo.

s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))

(Observe el uso de with, que le dice a R para buscar las variables dentro del entorno / trama de datos. Esto es mejor la práctica de utilizar s1 $ valor1, valor2 $ s2, etc.)

Ahora podemos simplemente fusionar (unir) las dos tramas de datos (por las variables presentes en las tramas de datos tanto: estado e índice).

merge(s1,s2)

que da

   state index value1 value2
1    IA     1      1      6
2    IA     2      2      7
3    IA     3      3      8
4    IL     1      4      3
5    IL     2      5      4
6    IL     3      6      5

Para que esto funcione, debe haber el mismo número de observaciones por parte del Estado en cada una de las tramas de datos.

[Editar: comentó el código para mayor claridad.] [Editar:. Se utiliza seq_len en lugar de crear una nueva función como sugiere Hadley]

Otros consejos

NOTA: Compruebe el quinto comentario sobre la respuesta anterior. Solución debe ser

s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))

Probado y de trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top