आर

2011-12-18 8 views
5

में अन्य कॉलम में मानों के आधार पर गिनती कॉलम जोड़ने के लिए मेरे पास अपेक्षाकृत बड़ा डेटासेट (16,000+ x ~ 31) है। दूसरे शब्दों में, यह काफी बड़ा है कि मैं एक्सेल में लाइन द्वारा इसे लाइन में हेरफेर नहीं करना चाहता हूं। डेटा इस रूप में है:आर

block site  day X1 X2 
1  1  1 0.4 5.1 
1  1  2 0.8 1.1 
1  1  3 1.1 4.2 
1  2  1 ... ... 
1  2  2 
1  2  3 
2  3  1 
2  3  2 
2  3  3 
2  4  1 
2  4  2 
2  4  3 

आप देख सकते हैं, साइट गिनती निरंतर है, लेकिन मैं एक स्तंभ जहां साइट संख्या प्रत्येक ब्लॉक के साथ रीसेट करता है चाहते हैं। उदाहरण के लिए, मैं इस नीचे की तरह कुछ करना चाहते हैं:

block site  day X1 X2 site2 
1  1  1 0.4 5.1 1 
1  1  2 0.8 1.1 1 
1  1  3 1.1 4.2 1 
1  2  1 ... ... 2 
1  2  2    2 
1  2  3    2 
2  3  1    1 
2  3  2    1 
2  3  3    1 
2  4  1    2 
2  4  2    2 
2  4  3    2 

मैं आर समारोह RLE उपयोग करने के बारे में सोच रहा था, लेकिन यकीन है कि अगर यह क्योंकि दिन के साथ जटिलताओं का काम करेंगे नहीं हूँ। अन्यथा, मैं की तरह कुछ की कोशिश करेंगे:

Data$site2 <- sequence(rle(Data$block)$lengths) 

किसी को भी एक स्तंभ गिनती (अनुक्रम) प्रत्येक ब्लॉक के भीतर साइटों की संख्या जोड़ने के लिए किसी भी सुझाव हैं? यदि यह मदद करता है, तो प्रत्येक साइट के लिए रिकॉर्ड किए गए दिनों की संख्या (263) है लेकिन प्रति ब्लॉक की एक अलग संख्या साइटें हैं।

ddply(df,.(block),transform, 
        site1 = rep(1:length(unique(site)), 
          times = rle(site)$lengths)) 

या एक से थोड़ा बरसाती कोट संस्करण:

उत्तर

6

यहाँ एक थोड़ा अनाड़ी समाधान plyr और ddply का उपयोग कर

ddply(df,.(block),transform,site1 = as.integer(as.factor(site))) 

वहाँ हालांकि सीधे यह कर, की एक चालाक रास्ता, का उपयोग कर किया जा सकता है विभिन्न seq, sequence और rle फ़ंक्शंस, लेकिन इस समय मेरा दिमाग थोड़ा आलसी है। यदि आप इसे थोड़ा सा खोलने के लिए छोड़ देते हैं तो संभवतः एक स्लिम गैर-plyr समाधान के साथ आ जाएगा।

+0

धन्यवाद, यह पूरी तरह से काम किया। मैंने पहले प्लीयर देखा है लेकिन कभी इसका इस्तेमाल नहीं किया। ddply सही है, मैं वास्तव में मैट्रिक्स को तोड़ने के लिए temped था, दिनों में reshape (= चौड़ा) का उपयोग करें, rle (साइट) लागू करें और फिर reshape (= लंबा) को फिर से प्रयास करने का प्रयास करें। मुझे नहीं पता कि यह काम करेगा या नहीं, लेकिन मुझे लगा कि ऐसा करने के लिए लगभग 1000 आसान तरीके थे। मुझे डीपीडीपी समाधान पसंद है। एक बार फिर धन्यवाद। – djhocking

+0

अच्छा है, बस एक ही समस्या पर ddply विकल्प का प्रयास किया और पूरी तरह से पहली बार काम किया – Ell

1

का उपयोग tapply एवेन्यू के माध्यम से

# Make some fake data 
dat <- data.frame(block = rep(1:3, each = 4), site = rep(1:6, each = 2), val = rnorm(12)) 
# For each block reset the count 
dat$site2 <- unlist(tapply(dat$site, dat$block, function(x){x - min(x) + 1})) 
+0

यह मेरे गन्दा डेटा के लिए काम नहीं कर रहा है। मैं भूल गया कि साइट पूरी तरह से निरंतर नहीं है क्योंकि कुछ साइटों पर dataloggers विफल या गायब हो गया। इसलिए कभी-कभी डेटासेट साइट नंबरों पर छोड़ दिया जाता है, लेकिन मुझे जो चाहिए वह एक चर है जो सिर्फ मायने रखता है ताकि मैं अपने विश्लेषण के हिस्से के रूप में लूप कार्यों में अनुक्रमण के साथ चक्र चला सकूं। हो सकता है कि अगर मैं आपके सुझावों का प्रयास करता हूं लेकिन कुछ चालाक फ़ंक्शन के साथ साइट 2 में पिछले मान को मूल साइट नंबर पर रखने के बजाय जोड़ता हूं। – djhocking

0

काम कर सकता था:

df1 <- structure(list(block = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2), 
    site = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4), day = c(1, 
    2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)), .Names = c("block", "site", 
"day"), row.names = c("2", "3", "4", "5", "6", "7", "8", "9", 
"10", "11", "12", "13"), class = "data.frame") 

df1$site2 <- ave(df1$site,df1$block,FUN=function(x) match(x,sort(unique(x))))