आर

2012-05-21 8 views
6

में एक मैट्रिक्स को अनुक्रमणित करना यहां एक नौसिखिया आर उपयोगकर्ता है। तो मैं स्वरूपित एक डेटा सेट की तरह:आर

Date Temp Month 
1-Jan-90 10.56  1 
2-Jan-90 11.11  1 
3-Jan-90 10.56  1 
4-Jan-90 -1.67  1 
5-Jan-90 0.56  1 
6-Jan-90 10.56  1 
7-Jan-90 12.78  1 
8-Jan-90 -1.11  1 
9-Jan-90 4.44  1 
10-Jan-90 10.00  1 

आर वाक्य रचना में:

datacl <- structure(list(Date = structure(1:10, .Label = c("1990/01/01", 
    "1990/01/02", "1990/01/03", "1990/01/04", "1990/01/05", "1990/01/06", 
    "1990/01/07", "1990/01/08", "1990/01/09", "1990/01/10"), class = "factor"), 
     Temp = c(10.56, 11.11, 10.56, -1.67, 0.56, 10.56, 12.78, 
     -1.11, 4.44, 10), Month = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
     1L, 1L)), .Names = c("Date", "Temp", "Month"), class = "data.frame", row.names = c(NA, 
    -10L)) 

मैं किसी माह विशेष डेटा सबसेट और अस्थायी में होने वाले बदलाव कारक लागू फिर परिणाम को बचाने के लिए चाहते हैं । तो मैं जैसे

idx <- subset(datacl, Month == 1) # Index 
results[idx[,2],1] = idx[,2]+change # change applied to only index values 

कुछ है, लेकिन मैं किसी भी मदद की तरह

Error in results[idx[, 2], 1] = idx[, 2] + change: 
    only 0's may be mixed with negative subscripts 

एक त्रुटि मिलती रहती है की सराहना की जाएगी।

उत्तर

2

पहले, परिवर्तन कारक एक मूल्य दे:

change <- 1 

अब, यहाँ एक सूची बनाने का तरीका है:

# one approach to subsetting is to create a logical vector: 
jan.idx <- datacl$Month == 1 

# alternatively the which function returns numeric indices: 
jan.idx2 <- which(datacl$Month == 1) 

आप जनवरी से सिर्फ डेटा के सबसेट चाहते हैं,

jandata <- datacl[jan.idx,] 
transformed.jandata <- transform(jandata, Temp = Temp + change) 

संपूर्ण डेटा फ्रेम रखने के लिए, लेकिन केवल जन temps में परिवर्तन कारक जोड़ें:

datacl$Temp[jan.idx] <- datacl$Temp[jan.idx] + change 
+0

धन्यवाद! वही जो मैं चाहता था। – user1408959

1

सबसे पहले, ध्यान दें कि subset एक सूचकांक का उत्पादन नहीं करता है, यह अपने मूल Month == 1 वाली सभी पंक्तियों से युक्त dataframe के एक सबसेट पैदा करता है।

फिर जब आप idx[,2] कर रहे हैं, तो आप Temp कॉलम का चयन कर रहे हैं।

results[idx[,2],1] = idx[,2] + change 

लेकिन तब एक सूचकांक results में है, यानी आप उन्हें पंक्ति संख्या के रूप में प्रयोग कर रहे हैं के रूप में इन का उपयोग कर रहे हैं। पंक्ति संख्या 10.56 या -1.11 जैसी चीजें नहीं हो सकती हैं, इसलिए आपकी त्रुटि। साथ ही, आप results का पहला कॉलम चुन रहे हैं जो Date है और इसमें तापमान जोड़ने की कोशिश कर रहा है।

कुछ तरीके हैं जो आप कर सकते हैं।

तुम इतनी तरह नहीं तो एक तार्किक सूचकांक कि Month == 1 और FALSE के साथ एक पंक्ति के लिए है TRUE बना सकते हैं:

idx <- datac1$Month == 1 

तो फिर तुम datac1 में पंक्तियों आप बदलना चाहते हैं का चयन करने के लिए कि सूचकांक का उपयोग कर सकते हैं (यह है क्या आप मूल रूप से करने के लिए कोशिश कर रहे थे, मुझे लगता है):

datac1$Temp[idx] <- datac1$Temp[idx] + change # or 'results' instead of 'datac1'? 

ध्यान दें कि datac1$Temp[idx] का चयन करता है datac1 और 01,231,715 की Temp स्तंभपंक्तियां।

तुम भी

datac1[idx,'Temp'] 

या

datac1[idx,2] # as Temp is the second column. 

आप केवलresults चाहते हैं सबसेट जहां Month == 1 होने के लिए, कोशिश कर सकता है:

results <- subset(datac1, Month == 1) 
results$Temp <- results$Temp + change 

इसका कारण यह हैहैमें केवल वही पंक्तियां हैं जिनमें आप रुचि रखते हैं, इसलिए सबसेटिंग करने की कोई आवश्यकता नहीं है।

+0

मैं विस्तृत स्पष्टीकरण की सराहना करता हूं। इससे मुझे यह समझने में मदद मिली कि क्या हो रहा था। धन्यवाद – user1408959

1

व्यक्तिगत रूप से, मैं ifelse() का उपयोग करें और लाभ उठाने वाक्यात्मक सौंदर्य यह है कि एक अच्छा एक लाइनर datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp)) के लिए within() होगा। खैर, मैंने एक लाइनर कहा, लेकिन आपको कहीं और change को परिभाषित करने की आवश्यकता होगी।

+0

यह भी उल्लेख करना चाहता है कि आप अन्य महीनों या शर्तों के लिए खाते में 'ifelse()' स्टेटमेंट घोंसला कर सकते हैं। टिप के लिए – Chase

+0

धन्यवाद! – user1408959