2012-09-11 10 views
8

लघु संस्करण: मैं डेटा फ्रेम के भीतर मूल्यों को किसी अन्य डेटा फ्रेम में प्राप्त स्ट्रिंग के साथ कैसे बदलूं?मैं आर में स्ट्रिंग के साथ डेटा फ्रेम के भीतर मूल्यों को कैसे बदलूं?

लंबा संस्करण: मैं एक जीवविज्ञानी हूं जो मधुमक्खी की कई प्रजातियों के साथ काम कर रहा है। मेरे पास हजारों मधुमक्खियों के साथ एक डेटा सेट है। प्रत्येक पंक्ति में उस नमूने के बारे में सभी प्रासंगिक जानकारी के साथ एक अद्वितीय मधुमक्खी आईडी # है (कैप्चर, जीपीएस स्थान आदि का डेटा)। प्रत्येक मधुमक्खी के लिए प्रजातियों की जानकारी दर्ज नहीं की गई है क्योंकि उन्हें आईडी में लंबा समय लगता है। जब IDing, मैं मधुमक्खियों के सौ के साथ, एक ही प्रजाति के सभी के साथ समाप्त होता है। मैं इन्हें एक अलग डेटा फ्रेम में दर्ज करता हूं। मैं कोड लिखने की कोशिश कर रहा हूं जो मूल डेटा फ़ाइल को प्रजातियों की जानकारी (परिवार, जीनस, प्रजातियां, लिंग इत्यादि) के साथ अपडेट करेगा क्योंकि मैं मधुमक्खियों को आईडी करता हूं। वर्तमान में, मूल डेटा फ़ाइल में, प्रजातियों की जानकारी खाली है और आर के भीतर एनए के रूप में व्याख्या की गई है। मैं आर को सभी अद्वितीय मधुमक्खी आईडी # ढूंढना चाहता हूं और प्रजातियों की जानकारी भरना चाहता हूं, लेकिन मुझे यह समझने में परेशानी हो रही है कि कैसे एक स्ट्रिंग (उदाहरण के लिए "Andrenidae") के साथ लागू नहीं मान की जगह

यहाँ मैं क्या करना है कोशिश कर रहा हूँ का एक सरल उदाहरण है:

rawData<-data.frame(beeID=c(1:20),family=rep(NA,20)) 
speciesInfo<-data.frame(beeID=seq(1,20,3),family=rep("Andrenidae",7)) 

rawData[rawData$beeID == 4,"family"] <- speciesInfo[speciesInfo$beeID == 4,"family"] 

तो, मैं चीजों की जगह कर रहा हूँ के रूप में मैं चाहता हूँ, लेकिन एक साथ परिवार के नाम की बजाय संख्या (एक स्ट्रिंग)। क्या मैं अंत में करना चाहते हैं किसी भी सलाह के लिए अग्रिम में सभी प्रजातियों की जानकारी में जोड़ने के लिए एक छोटे से पाश, उदा .:

for (i in speciesInfo$beeID){ 
    rawData[rawData$beeID == i,"family"] <- speciesInfo[speciesInfo$beeID == i,"family"] 
} 

धन्यवाद लिखने है!

चीयर्स,

ज़क

संपादित करें:

मैं सिर्फ इतना है कि पहले दो विधियों के नीचे एक नया स्तंभ, हर बार जोड़ने समस्या का कारण बन जो देखा है कि अगर मैं प्रजातियों की जानकारी कई बार जोड़ने की जरूरत (जो मैं आमतौर पर करता हूं)। उदाहरण के लिए:

rawData<-data.frame(beeID=c(1:20),family=rep(NA,20)) 
Andrenidae<-data.frame(beeID=seq(1,20,3),family=rep("Andrenidae",7)) 
Halictidae<-data.frame(beeID=seq(1,20,3)+1,family=rep("Halictidae",7)) 

# using join 
library(plyr) 
rawData <- join(rawData, Andrenidae, by = "beeID", type = "left") 
rawData <- join(rawData, Halictidae, by = "beeID", type = "left") 

# using merge 
rawData <- merge(x=rawData,y=Andrenidae,by='beeID',all.x=T,all.y=F) 
rawData <- merge(x=rawData,y=Halictidae,by='beeID',all.x=T,all.y=F) 

क्या कॉलम को तोड़ने का कोई तरीका है ताकि मेरे पास एक, एकीकृत डेटा फ्रेम हो? या हर बार एक नया कॉलम जोड़ने के बजाय कच्चे डेटा को अपडेट करने का एक तरीका? अग्रिम में धन्यवाद!

उत्तर

2

आप merge फ़ंक्शन का उपयोग कर सकते हैं, उदा। :

rawData <- data.frame(beeID=c(1:20),family=rep(NA,20)) 
speciesInfo <- data.frame(beeID=seq(1,20,3), 
          family=c(rep('Halictidae',4), rep("Andrenidae",3))) 

merged <- merge(x=rawData,y=speciesInfo,by='beeID',all.x=T,all.y=F) 
merged$family.x <- NULL # remove the family.x column 
names(merged) <- c('beeID','family') # rename the columns 

N.B.

family कॉलम के साथ rawData प्रारंभ करना आवश्यक नहीं है।
मर्ज फ़ंक्शन इसे स्वचालित रूप से जोड़ देगा, उदा। :

rawData <- data.frame(beeID=c(1:20)) 
speciesInfo <- data.frame(beeID=seq(1,20,3), 
          family=c(rep('Halictidae',4), rep("Andrenidae",3))) 

merged <- merge(x=rawData,y=speciesInfo,by='beeID',all.x=T,all.y=F) 

> merged 
    beeID  family 
1  1 Halictidae 
2  2  <NA> 
3  3  <NA> 
4  4 Halictidae 
5  5  <NA> 
6  6  <NA> 
7  7 Halictidae 
8  8  <NA> 
9  9  <NA> 
10 10 Halictidae 
11 11  <NA> 
12 12  <NA> 
13 13 Andrenidae 
14 14  <NA> 
15 15  <NA> 
16 16 Andrenidae 
17 17  <NA> 
18 18  <NA> 
19 19 Andrenidae 
20 20  <NA> 
+0

अद्भुत में रुचि रखते हैं है, मदद के लिए धन्यवाद! – Arturito

3

एक अन्य विकल्प पैकेज plyr

library(plyr) 
#Adding family ahead of time was unnecessary so I'll remove it alongside the join. 
join(rawData, speciesInfo, by = "beeID", type = "left")[,-2] 
    beeID  family 
1  1 Andrenidae 
2  2  <NA> 
3  3  <NA> 
4  4 Andrenidae 
5  5  <NA> 
6  6  <NA> 
7  7 Andrenidae 
8  8  <NA> 
9  9  <NA> 
10 10 Andrenidae 
11 11  <NA> 
12 12  <NA> 
13 13 Andrenidae 
14 14  <NA> 
15 15  <NA> 
16 16 Andrenidae 
17 17  <NA> 
18 18  <NA> 
19 19 Andrenidae 
20 20  <NA> 

अद्यतन

# If you anticipate adding new species over time, 
# simply rbind those into a single reference data.frame to merge with your rawData. 
# Like so: 
library(plyr) 
rawData <- join(rawData, rbind(Andrenidae, Halictidae), by = "beeID", type = "left") 

# To keep you code clean, you could do this step ahead of time 
species_list <- rbind(Andrenidae, Halictidae) 
rawData <- join(rawData, species_list, by = "beeID", type = "left") 
+0

शानदार! धन्यवाद! – Arturito

+0

मुझे यकीन नहीं था कि उत्तर में कोड कैसे शामिल किया जाए, इसलिए मैंने अपना मूल प्रश्न फॉलो अप प्रश्न के साथ संपादित किया। मैं हमेशा एक लकीर रहा हूं, इसलिए मुझे अभी तक योगदान देने का लटका नहीं मिला है। किसी भी और सभी मदद के लिए फिर से धन्यवाद! – Arturito

+1

खुशी है कि आपने अपना प्रश्न संपादित किया है (इस प्रकार एसओ को काम करना चाहिए, यानी, उत्तर के आधार पर अपने प्रश्न को स्पष्ट और सुधारें)। संपादित उत्तर को आपके नए प्रश्न को संबोधित करना चाहिए। यदि आपका डेटासेट काफी बड़ा हो जाता है, तो इसके लिए और अधिक शक्तिशाली समाधान हैं। – Maiasaura

4

यहाँ में ?join उपयोग करने के लिए है एक समारोह मुझे लगता है कि आप के लिए काम करेगा। यह आपके एनोटेशन डेटाफ्रेम में मानों को ढूंढने और अनुक्रमणित करने के लिए match का उपयोग करता है, और फिर कच्चे डेटा में मानों को प्रतिस्थापित करता है।

replaceID <- function(to,from,mergeBy,values){ 
    x <- match(from[,mergeBy],to[,mergeBy]) 
    to[,values][x] <- as.character(from[,values]) 
    return(to) 
} 
> rawData <- replaceID(rawData,Halictidae,"beeID","family") 
> rawData 
    beeID  family 
1  1  <NA> 
2  2 Halictidae 
3  3  <NA> 
4  4  <NA> 
5  5 Halictidae 
6  6  <NA> 
7  7  <NA> 
8  8 Halictidae 
9  9  <NA> 
10 10  <NA> 
11 11 Halictidae 
12 12  <NA> 
13 13  <NA> 
14 14 Halictidae 
15 15  <NA> 
16 16  <NA> 
17 17 Halictidae 
18 18  <NA> 
19 19  <NA> 
20 20 Halictidae 
+0

यह सही है, यह वही करता है जो मैंने शुरू में किया था। सहायता के लिए धनयवाद! चीयर्स, जैक – Arturito

+0

आपका स्वागत है। मधुमक्खियों के साथ शुभकामनाएँ! –

2

data.table समाधान जो स्मृति और समय कुशल होगा।

  • ध्यान दें कि आप rbindlist के लिए stringsAsFactors = F (do.call (rbind की एक सुपर फास्ट संस्करण, सूची)/rbind) की आवश्यकता है
  • मैं rawData वस्तु के लिए डमी डेटा के रूप में एक और स्तंभ जोड़ दिया है और हटाया परिवार

डेटा बनाएं -

rawData <- data.frame(beeID = c(1:20), other_stuff = sample(letters, 20), stringsAsFactors = F) 
Andrenidae <- data.frame(beeID = seq(1, 20, 3), family = rep("Andrenidae", 7), stringsAsFactors = F) 
Halictidae <- data.frame(beeID = seq(1, 20 , 3)+ 1, family = rep("Halictidae", 7), stringsAsFactors = F) 
library(data.table) 
# convert to data.table 
rawDT <- as.data.table(rawData) 
# combine the list of Species-specific data.frames into a large data.table 
speciesInfo <- rbindlist(list(Andrenidae, Halictidae)) 
# set the keys, to allow efficient use of data.table and its merging 
# abilities. The keys are the same for both 
setkeyv(rawDT, 'beeID') 
setkeyv(speciesInfo, 'beeID') 
# merge by key 
speciesInfo[rawDT, nomatch = NA] 
## beeID  family other_stuff 
## 1:  1 Andrenidae   s 
## 2:  2 Halictidae   x 
## 3:  3   NA   i 
## 4:  4 Andrenidae   e 
## 5:  5 Halictidae   v 
## 6:  6   NA   q 
## 7:  7 Andrenidae   w 
## 8:  8 Halictidae   c 
## 9:  9   NA   u 
## 10: 10 Andrenidae   z 
## 11: 11 Halictidae   y 
## 12: 12   NA   a 
## 13: 13 Andrenidae   l 
## 14: 14 Halictidae   r 
## 15: 15   NA   h 
## 16: 16 Andrenidae   o 
## 17: 17 Halictidae   n 
## 18: 18   NA   g 
## 19: 19 Andrenidae   p 
## 20: 20 Halictidae   m 

या

rawDT[speciesInfo] 

## beeID other_stuff  family 
## 1:  1   s Andrenidae 
## 2:  2   x Halictidae 
## 3:  4   e Andrenidae 
## 4:  5   v Halictidae 
## 5:  7   w Andrenidae 
## 6:  8   c Halictidae 
## 7: 10   z Andrenidae 
## 8: 11   y Halictidae 
## 9: 13   l Andrenidae 
## 10: 14   r Halictidae 
## 11: 16   o Andrenidae 
## 12: 17   n Halictidae 
## 13: 19   p Andrenidae 
## 14: 20   m Halictidae 

कौन सा कभी डेटा आप

संबंधित मुद्दे