2012-07-13 28 views
9

पर मैपिंग कारक मेरे पास दो डेटा सेटों पर प्रसारित डेटा नमूना है। loc भौगोलिक स्थिति का वर्णन करता है, spe में पाए गए प्रजातियां हैं। Unfortunally, नमूने स्टेशनों दो कारकों (cruise और station) द्वारा वर्णित हैं, तो मैं दोनों डेटा के लिए एकमात्र पहचान का निर्माण करने की आवश्यकता सेटडेटा फ्रेम

>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 

और

>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 

मैं क्या जरूरत है एक अद्वितीय को जोड़ने के लिए है के रूप में ऐसी

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 

पहचानकर्ता ID यहाँ डेटा है

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

फिर, मैं ID के लिए loc

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

निर्माण लेकिन मैं spe करने के लिए ID कैसे मैप करते हैं?

जिस तरह से मैंने पाया है कि दो नेस्टेड लूप मेरे जैसे प्रक्रियात्मक प्रोग्रामर के लिए काफी सुन्दर हैं (अगर नेस्टेड लूप को बिल्कुल सुन्दर कहा जा सकता है)। मुझे पूरा यकीन है कि आर में दो-लाइनर अधिक कुशल और तेज काम करेंगे, लेकिन मैं इसे समझ नहीं सकता। मैं वास्तव में अपने कोड में और अधिक सुंदरता चाहता हूं, यह इतना अन-आर है।

+4

+1 स्टैक ओवरव्लो में आपका स्वागत है। मेरी इच्छा है कि सभी नए प्रश्न इस तरह स्पष्ट हों, नमूना डेटा, अपेक्षित परिणाम और कार्य कोड के साथ! – Andrie

उत्तर

5

वास्तव में, मुझे लगता है कि यह एक मामले में जहां आधार आर में merge सिर्फ काम करता है:

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 

एकमात्र पहचान ढूंढने के लिए, unique() का उपयोग करें:

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

जाने का रास्ता है। धन्यवाद दोस्त! – Janhoo

+0

लेकिन फिर भी मुझे अद्वितीय पहचानकर्ताओं की आवश्यकता है। इतना कठिन नहीं होना चाहिए - मैं कोशिश करूंगा। – Janhoo

+0

@sunpyg आप 'अद्वितीय' और 'पेस्ट' का उपयोग कर सकते हैं - मैंने अपना जवाब संपादित किया। – Andrie

3

आप कारकों को जोड़ सकते हैं interaction के साथ।

यदि आप आईडी कॉलम के लिए लेबल के बारे में परेशान नहीं हैं तो समाधान वास्तव में आसान है।

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

बस दिखाने के लिए जहां इस फलस्वरूप की ओर जाता है (ब्याज की हो सकता है):

एकमात्र पहचान ID के रूप में पहले ही कहा गया loc से जुड़ जाते हैं।

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

Andrie merge(spe, loc, all.x=TRUE) द्वारा प्रस्तावित के रूप में, जरूरत के रूप में data.frames को जोड़ती है कि spe में एक समकक्ष नहीं हो सकता है (ये उपयोग merge(spe, loc, all.x=TRUE, all.y=TRUE) बजाय।

संरक्षित किया जाना चाहिए अगर मैं एक मेज चाहते loc के सभी तत्वों को नष्ट स्टेशन प्रति सभी प्रजातियों प्रचुरता है, जिसके द्वारा

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 

Andrie और श्री कपास को

012 धन्यवाद हासिल की है और डेटा फ्रेम में बदल जाती है की