2013-04-24 6 views
26

मैं dataframe निम्नलिखित है:कट() त्रुटि - 'ब्रेक' अद्वितीय नहीं हैं

a   
    ID a.1 b.1  a.2 b.2 
1 1 40.00 100.00 NA 88.89 
2 2 100.00 100.00 100 100.00 
3 3 50.00 100.00 75 100.00 
4 4 66.67 59.38 NA 59.38 
5 5 37.50 100.00 NA 100.00 
6 6 100.00 100.00 100 100.00 

जब मैं इस dataframe के लिए निम्न कोड लागू करें:

temp <- do.call(rbind,strsplit(names(df)[-1],".",fixed=TRUE)) 
dup.temp <- temp[duplicated(temp[,1]),] 

res <- lapply(dup.temp[,1],function(i) { 
breaks <- c(-Inf,quantile(a[,paste(i,1,sep=".")], na.rm=T),Inf) 
cut(a[,paste(i,2,sep=".")],breaks) 
}) 

कटौती() फ़ंक्शन एक देता है त्रुटि:

Error in cut.default(a[, paste(i, 2, sep = ".")], breaks) : 
'breaks' are not unique 

हालांकि, एक ही कोड पूरी तरह से अच्छी तरह से समान dataframe पर काम करता है:

varnames<-c("ID", "a.1", "b.1", "c.1", "a.2", "b.2", "c.2") 

a <-matrix (c(1,2,3,4, 5, 6, 7), 2,7) 

colnames (a)<-varnames 

df<-as.data.frame (a) 


    ID a.1 b.1 c.1 a.2 b.2 c.2 
    1 1 3 5 7 2 4 6 
    2 2 4 6 1 3 5 7 

res <- lapply(dup.temp[,1],function(i) { 
breaks <- c(-Inf,quantile(a[,paste(i,1,sep=".")], na.rm=T),Inf) 
cut(a[,paste(i,2,sep=".")],breaks) 
}) 

res 
[[1]] 
[1] (-Inf,3] (-Inf,3] 
Levels: (-Inf,3] (3,3.25] (3.25,3.5] (3.5,3.75] (3.75,4] (4, Inf] 

[[2]] 
[1] (-Inf,5] (-Inf,5] 
Levels: (-Inf,5] (5,5.25] (5.25,5.5] (5.5,5.75] (5.75,6] (6, Inf] 

[[3]] 
[1] (5.5,7] (5.5,7] 
Levels: (-Inf,1] (1,2.5] (2.5,4] (4,5.5] (5.5,7] (7, Inf] 

इस त्रुटि का कारण क्या है? इसे कैसे ठीक किया जा सकता है? धन्यवाद।

उत्तर

24

आपको यह त्रुटि प्राप्त क्योंकि कॉलम b.1, a.2 और b.2 के लिए अपने डेटा में quantile मूल्यों कुछ स्तरों के लिए ही कर रहे हैं, इसलिए वे नहीं सीधे समारोह cut() में टूट जाता है मूल्यों के रूप में इस्तेमाल किया जा सकता। इस समस्या को हल करने के लिए

apply(a,2,quantile,na.rm=T) 
     ID  a.1 b.1 a.2  b.2 
0% 1.00 37.5000 59.38 75.0 59.3800 
25% 2.25 42.5000 100.00 87.5 91.6675 
50% 3.50 58.3350 100.00 100.0 100.0000 
75% 4.75 91.6675 100.00 100.0 100.0000 
100% 6.00 100.0000 100.00 100.0 100.0000 

एक तरह से unique() समारोह अंदर quantile() डाल करने के लिए हो सकता है - ताकि आप सभी quantile मूल्यों कि अद्वितीय नहीं हैं निकाल देंगे। अगर मात्रा अद्वितीय नहीं है तो यह निश्चित रूप से कम तोड़ने वाले अंक बनाएगा।

res <- lapply(dup.temp[,1],function(i) { 
    breaks <- c(-Inf,unique(quantile(a[,paste(i,1,sep=".")], na.rm=T)),Inf) 
    cut(a[,paste(i,2,sep=".")],breaks) 
}) 

[[1]] 
[1] <NA>  (91.7,100] (58.3,91.7] <NA>  <NA>  (91.7,100] 
Levels: (-Inf,37.5] (37.5,42.5] (42.5,58.3] (58.3,91.7] (91.7,100] (100, Inf] 

[[2]] 
[1] (59.4,100] (59.4,100] (59.4,100] (-Inf,59.4] (59.4,100] (59.4,100] 
Levels: (-Inf,59.4] (59.4,100] (100, Inf] 
+0

आपको बहुत धन्यवाद, Didzis Elferts! अब सब कुछ स्प्ष्ट है। – DSSS

7

आप बल्कि quantiles की संख्या रखना चाहते हैं, तो एक और विकल्प सिर्फ घबराना, उदा का एक छोटा सा जोड़ने के लिए है

breaks = c(-Inf,quantile(a[,paste(i,1,sep=".")], na.rm=T),Inf) 
breaks = breaks + seq_along(breaks) * .Machine$double.eps 
7

कटौती के बजाय, आप .bincode का उपयोग कर सकते हैं, जो ब्रेक के एक अद्वितीय अद्वितीय वेक्टर को स्वीकार करता है।

2

जब आप कहते हैं कि दशमक, चतुर्थक आदि यदि आप वास्तव में अपने आबादी का 10% या 25% हिस्से और दशमक/चतुर्थक बाल्टी यहाँ के नहीं वास्तविक संख्यात्मक मान मतलब है कि आप क्या इस्तेमाल कर सकते हैं है:

a <- c(1,1,1,2,3,4,5,6,7,7,7,7,99,0.5,100,54,3,100,100,100,11,11,12,11,0) 
ar<-rank(a,ties.method = "first") 
decile <- cut(ar, quantile(ar, probs=0:10/10), include.lowest=TRUE, labels=FALSE) 
संबंधित मुद्दे