2012-11-29 25 views
6

पर आधारित डेटाफ्रेम को अनुक्रमणित करना मेरे पास एक बहुत बड़ा डेटाफ्रेम है जिसे मैं वेक्टर के एक निश्चित सबसेट के आधार पर एक सबसेट सहेजना चाहता हूं।वेक्टर सबसेट

> id<-c("ID1","ID2","ID2","ID3","ID4","ID4","ID4","ID4","ID4") 
> status<-c("flag","flag","none","none","flag","flag","flag","none","flag") 
> misc1ofmany<-c("etc1","etc2","etc3","etc4","etc5","etc6","etc7","etc8","etc9") 
> df = data.frame(id, status, misc1ofmany) ; df 
    id status misc1ofmany 
1 ID1 flag  etc1 
2 ID2 flag  etc2 
3 ID2 none  etc3 
4 ID3 none  etc4 
5 ID4 flag  etc5 
6 ID4 flag  etc6 
7 ID4 flag  etc7 
8 ID4 none  etc8 
9 ID4 flag  etc9 

मैं आईडी की सभी पंक्तियां चिह्नित किया गया है, उनके गैर चिह्नित किये सत्र के समावेशी करना चाहते हैं: संक्षेप में मैं कुछ इस तरह की है। अभी मैं grep द्वारा अन्य आईडी की अनुक्रमणिका प्राप्त करने और इसे वापस एक नए डीएफ में प्लग करने की कोशिश कर रहा हूं। असल रूप में मैं इस बाहर लिखा था मैं पता लगा कि grepl के साथ काम करने के लिए आसान हो सकता है:

> flaggedIDsdf <- df[flaggedIDs.allStats.Index] ; flaggedIDsdf 
    id status misc1ofmany 
1 ID1 flag  etc1 
2 ID2 flag  etc2 
3 ID2 none  etc3 
4 ID4 flag  etc5 
5 ID4 flag  etc6 
6 ID4 flag  etc7 
7 ID4 none  etc8 
8 ID4 flag  etc9 

मैं इस तरह लग रहा है मैं से अधिक आसान होना चाहिए:

> flaggedIDs <- unique(as.vector(df$id[grep("flag",df$status)])) 
> flaggedIDs.allStats.Index <- mapply(grepl,df$id,MoreArgs=list(x=flaggedIDs)) 
> flaggedIDs.allStats.Index 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[2,] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE 
[3,] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 

लेकिन मैं सिर्फ यहाँ करने के लिए प्राप्त करना चाहते हैं मैं इसे बाहर कर रहा हूं, हालांकि मैंने इसका लाभ उठाने के लिए कई संभावनाओं की कोशिश की है। इस सवाल को लिखने से यह मेरे दिमाग में एक स्पष्ट/सरल समस्या बन गया है (ऐसा लगता है कि मुझे अभी एक कदम याद आ रहा है), लेकिन अब मैं यह भी सोच रहा हूं कि इसके बारे में जाने का एक और अधिक प्रभावी तरीका है या नहीं।

उत्तर

6

data.table यहाँ वास्तव में उपयोगी है के लिए यह सुरुचिपूर्ण वाक्य रचना और स्मृति क्षमता है

library(data.table) 

DT <- data.table(df) 

setkey(DT, 'id') 

DT[DT[status=='flag', list(id = unique(id))]] 

    id status misc1ofmany 
1: ID1 flag  etc1 
2: ID2 flag  etc2 
3: ID2 none  etc3 
4: ID4 flag  etc5 
5: ID4 flag  etc6 
6: ID4 flag  etc7 
7: ID4 none  etc8 
8: ID4 flag  etc9 

या और भी अधिक दृढ़तापूर्वक

DT[J(unique(id[status=='flag']))] 

उपयोग ऊपर इन दो दृष्टिकोण तथ्य यह है कि i घटक data.table से पहले मूल्यांकन किया जाता है । id की कुंजी का अर्थ है कि हम केवल ids निकालने के लिए स्वयं-जुड़ सकते हैं जहां status=='flag


या, by

DT[,if(any(status=='flag')){.SD} ,by=id] 

इस का उपयोग करते हुए id द्वारा DT के सबसेट के माध्यम से चला जाता है, और .SD रिटर्न (उप-समूह की data.table) यदि any(status=='flag') (उस सबसेट के भीतर)।

+0

बहुत सुरुचिपूर्ण संशोधित करें! जवाब के लिए धन्यवाद! – stites

1

मेरा मानना ​​है कि आप क्या करने की एक पंक्ति में नियंत्रित किया जा सकता है कोशिश कर रहे हैं

df[which(df$id %in% df$id[df$status=="flag"]), ] 

परिणाम:

df[df$id %in% df$id[df$status == "flag"],] 

सादे अंग्रेजी: से

id status misc1ofmany 
1 ID1 flag  etc1 
2 ID2 flag  etc2 
3 ID2 none  etc3 
5 ID4 flag  etc5 
6 ID4 flag  etc6 
7 ID4 flag  etc7 
8 ID4 none  etc8 
9 ID4 flag  etc9 
+0

वह आईडी और पंक्तियों को तब तक रखना चाहता है जब तक इसे ध्वजांकित किया गया हो। यह केवल उन लोगों को रखता है जो ध्वजांकित होते हैं। –

+0

@ ब्रैंडन वूप्स! स्पष्टीकरण के लिए धन्यवाद, बीमार –

2

यह काम करने के लिए लगता है डेटा फ्रेम, प्रत्येक पंक्ति का चयन करें जिसका आईडी तत्व आईडी तत्वों के वेक्टर में है जिनकी स्थिति किसी भी पंक्ति में ध्वजांकित होती है।