2012-07-13 20 views
9

Mam dane próbkowania rozłożone na dwa zestawy danych. loc opisuje pozycje geograficzne, spe zawiera znalezione gatunki. Unfortunally, stacje pobierania próbek są opisane przez dwa czynniki (cruise i station), więc trzeba zbudować unikalne identyfikatory dla obu zestawów danychczynniki odwzorowujące na ramkę danych

>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 

i

>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 

co potrzebne jest aby dodać unikalny identyfikator ID jako taki

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 

Oto dane

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

Potem skonstruować ID dla loc

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

ale jak mogę mapować ID do spe?

Sposób, w jaki znalazłem obejmuje dwie zagnieżdżone pętle jest dość przystojny dla programisty proceduralnego takiego jak ja (jeśli zagnieżdżone pętle można nazwać przystojnym w ogóle). Jestem tak pewna, że ​​dwuwarstwowy R będzie bardziej wydajny i szybszy, ale nie mogę tego rozgryźć. Naprawdę chcę więcej piękna w moim kodzie, to jest takie un-R.

+4

+1 Witamy w StackOverflow. Chciałbym, aby wszystkie nowe pytania były tak jednoznaczne, z przykładowymi danymi, oczekiwanymi rezultatami i działającym kodem! – Andrie

Odpowiedz

5

Faktycznie, myślę, że jest to przypadek, w którym merge w podstawowej R prostu działa:

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 

Aby znaleźć unikalne identyfikatory, użyj unique():

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

To jest droga. Dzięki! – Janhoo

+0

Ale wciąż potrzebuję unikalnych identyfikatorów. Nie powinno to być trudne - spróbuję. – Janhoo

+0

@sunpyg Możesz użyć 'unique' i' paste' - Edytowałem swoją odpowiedź. – Andrie

3

Można łączyć czynniki z interaction.

Jeśli nie przejmujesz się etykietami kolumny ID, rozwiązanie jest naprawdę łatwe.

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

Wystarczy, aby pokazać, gdzie to w konsekwencji prowadzi do (może być interesujące):

Unikalne identyfikatory ID są dodawane do loc jak już wspomniano.

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

Zgodnie z propozycją Andrie merge(spe, loc, all.x=TRUE) łączy data.frames miarę potrzeb, eliminując wszystkie elementy loc, że może nie mieć odpowiednika w spe (jeśli te powinny być zachowane korzystanie merge(spe, loc, all.x=TRUE, all.y=TRUE) zamiast.

chcę tabelę wszystkich gatunków częstości na stacji, które uzyskuje się i przekształca w ramce danych o

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 

Dzięki Andrie oraz Pan bawełny

Powiązane problemy