2012-07-13 7 views
9

Tengo datos de muestreo distribuidos en dos conjuntos de datos. loc describe las posiciones geográficas, spe contiene especies encontradas. Unfortunally, las estaciones de muestreo se describen por dos factores (cruise y station), así que necesitan para construir identificadores únicos para los dos conjuntos de datosfactores de mapeo en el marco de datos

>loc 
    cruise station  lon lat 
1 TY1  A1 53.8073 6.7836 
2 TY1  3 53.7757 6.7009 
3 AZ7  A1 53.7764 6.6758 

y

>spe 
    cruise station  species abundance 
1 TY1  A1 Ensis ensis  100 
2 TY1  A1 Magelona   5 
3 TY1  A1 Nemertea  17 
4 TY1  3 Magelona   8 
5 TY1  3  Ophelia  1200 
6 AZ7  A1  Ophelia  950 
7 AZ7  A1 Ensis ensis  89 
8 AZ7  A1  Spio   1 

lo que necesito es añadir un único identificador ID como tal

cruise station  species abundance  ID 
1 TY1  A1 Ensis ensis  100 STA0001 
2 TY1  A1 Magelona   5 STA0001 
3 TY1  A1 Nemertea  17 STA0001 
4 TY1  3 Magelona   8 STA0002 
5 TY1  3  Ophelia  1200 STA0002 
6 AZ7  A1  Ophelia  950 STA0003 
7 AZ7  A1 Ensis ensis  89 STA0003 
8 AZ7  A1  Spio   1 STA0003 

Aquí está los datos

loc<-data.frame(cruise=c("TY1","TY1","AZ7"),station=c("A1",3,"A1"),lon=c(53.8073, 53.7757, 53.7764),lat=c(6.7836, 6.7009, 6.6758)) 

spe<-data.frame(cruise=c(rep("TY1",5),rep("AZ7",3)),station=c(rep("A1",3),rep(3,2),rep("A1",3)),species=c("Ensis ensis", "Magelona", "Nemertea", "Magelona", "Ophelia", "Ophelia","Ensis ensis", "Spio"),abundance=c(100,5,17,8,1200,950,89,1)) 

Entonces, construyo el ID para loc

loc$ID<-paste("STA",formatC(1:nrow(loc),width=4,format="d",flag="0"),sep="") 

pero ¿cómo en el mapa los ID-spe?

La forma que encontré involucra dos bucles anidados que es bastante atractiva para un programador de procedimientos como yo (si los bucles anidados se pueden llamar apuestos). Estoy tan seguro de que un dos líneas en R sería más eficiente y más rápido, pero no puedo entenderlo. Realmente quiero más belleza en mi código, esto es tan poco-R.

+4

+1 Bienvenido a StackOverflow. ¡Ojalá todas las preguntas nuevas fueran tan claras como esta, con datos de muestra, resultados esperados y código de trabajo! – Andrie

Respuesta

5

En realidad, creo que este es un caso en el que merge en la base de R simplemente funciona:

merge(spe, loc, all.x=TRUE) 

    cruise station  species abundance  lon lat 
1 AZ7  A1  Ophelia  950 53.7764 6.6758 
2 AZ7  A1 Ensis ensis  89 53.7764 6.6758 
3 AZ7  A1  Spio   1 53.7764 6.6758 
4 TY1  3 Magelona   8 53.7757 6.7009 
5 TY1  3  Ophelia  1200 53.7757 6.7009 
6 TY1  A1 Ensis ensis  100 53.8073 6.7836 
7 TY1  A1 Magelona   5 53.8073 6.7836 
8 TY1  A1 Nemertea  17 53.8073 6.7836 

Para encontrar los identificadores únicos, utilice unique():

unique(paste(loc$cruise, loc$station, sep="-")) 
[1] "TY1-A1" "TY1-3" "AZ7-A1" 
+0

ese es el camino a seguir. ¡Gracias hombre! – Janhoo

+0

Pero aún necesito los identificadores únicos. No debería ser tan difícil, lo intentaré. – Janhoo

+0

@sunpyg Puedes usar 'unique' y' paste' - He editado mi respuesta. – Andrie

3

Se pueden combinar factores con interaction.

Si no le molestan las etiquetas para la columna ID, la solución es realmente fácil.

loc <- within(loc, id <- interaction(cruise, station)) 
spe <- within(spe, id <- interaction(cruise, station)) 
0

sólo para mostrar que esto conduce a la consecuencia (puede ser de interés):

identificadores únicos ID se añaden a loc como ya se ha dicho.

loc$ID<-paste("STA", formatC(1:nrow(loc), width=4, format="d", flag="0"), sep="") 

Según lo propuesto por Andrie merge(spe, loc, all.x=TRUE) combina data.frames según sea necesario, eliminando todos los elementos de loc que podrían no tener una contrapartida en spe (si éstos se deben preservar el uso merge(spe, loc, all.x=TRUE, all.y=TRUE) lugar.

Quiero una mesa de todas las abundancias de especies por estación, que se consigue y se convierte en trama de datos por

as.data.frame.matrix(xtabs(abundance ~ ID + species, merge(spe, loc, all.x=T))) 
     Ensis ensis Magelona Nemertea Ophelia Spio 
STA0001   100  5  17  0 0 
STA0002   0  8  0 1200 0 
STA0003   89  0  0  950 1 

Gracias a Andrie y el Sr. Cotton

Cuestiones relacionadas