2012-07-13 19 views
9

Ich habe Stichproben Daten über zwei Datensätze verteilt. loc beschreibt geographische Positionen, spe enthält Arten gefunden. Unfortunally werden die Meßstellen durch zwei Faktoren beschrieben (cruise und station), so müssen i eindeutige Identifikatoren für beide Daten konstruieren setztMapping-Faktoren zu Datenrahmen

>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 

und

>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 

was ich brauche ist ein einzigartiges hinzuzufügen ID Kennung als solche

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 

Hier die Daten

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)) 

Dann konstruiere ich die ID für loc

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

aber wie ordne ich die ID-spe?

Die Art und Weise, wie ich gefunden habe beinhaltet zwei verschachtelte Schleifen ist ziemlich gut aussehend für einen prozeduralen Programmierer wie mich (wenn verschachtelte Schleifen überhaupt gut aussehend genannt werden können). Ich bin mir so sicher, dass ein Zweiliner in R effizienter und schneller wäre, aber ich kann es nicht herausfinden. Ich möchte wirklich mehr Schönheit in meinem Code, das ist so un-R.

+4

+1 Willkommen bei StackOverflow. Ich wünschte, alle neuen Fragen wären so klar, mit Beispieldaten, erwarteten Ergebnissen und Arbeitscode! – Andrie

Antwort

5

Eigentlich Ich denke, dies ist ein Fall, wo merge in Basis R gerade arbeitet:

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 

die eindeutigen IDs zu finden, verwenden unique():

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

das ist der Weg zu gehen. Danke, Mann! – Janhoo

+0

Aber ich brauche immer noch die eindeutigen Bezeichner. Sollte das nicht schwierig sein - ich werde es versuchen. – Janhoo

+0

@sunpyg Sie können 'unique' und' paste' verwenden - ich habe meine Antwort bearbeitet. – Andrie

3

Sie Faktoren kombinieren mit interaction.

Wenn Sie sich nicht um die Beschriftungen für die ID-Spalte kümmern, ist die Lösung wirklich einfach.

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

Nur um zu zeigen, wo diese folglich führt (könnte von Interesse sein):

Identifizierungsmerkmale ID-loc hinzugefügt werden, wie bereits erwähnt.

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

Wie Andrie vorgeschlagen merge(spe, loc, all.x=TRUE) kombiniert data.frames nach Bedarf, alle Elemente der loc eliminiert werden, die keine Entsprechung in spe haben könnte (wenn diese stattdessen Verwendung merge(spe, loc, all.x=TRUE, all.y=TRUE) erhalten werden sollte.

Ich möchte einen Tisch alle Arten Abundanz pro Station, die von

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 

Dank Andrie und Mr. Cotton

012 Datenrahmen erreicht und umgesetzt wird
Verwandte Themen