2016-10-12 5 views
5

कुछ गंदे डेटा को साफ़ करने के लिए मैं पाइप%>% का उपयोग शुरू करना चाहता हूं, लेकिन अगर मैं पाइप की शुरुआत में gsub() नहीं है तो मैं आर कोड काम करने में विफल रहता हूं , होने चाहिए देर से (नोट: इस सवाल का उचित आयात के साथ संबंध नहीं है, लेकिन डेटा सफाई के साथ)आर: कई gsub() फ़ंक्शन इना पाइप को गठबंधन करें

सरल उदाहरण:

df <- cbind.data.frame(A= c("2.187,78 ", "5.491,28 ", "7.000,32 "), B = c("A","B","C")) 

स्तम्भ A, इस मामले संख्या में (वर्ण हैं, लेकिन यह भी हो सकता है स्ट्रिंग) और साफ करने की जरूरत है। कदम हैं

df$D <- gsub("\\.","",df$A) 
df$D <- str_trim(df$D) 
df$D <- as.numeric(gsub(",", ".",df$D)) 

एक आसानी से पाइप सकता है इस

df$D <- gsub("\\.","",df$A) %>% 
      str_trim() %>% 
      as.numeric(gsub(",", ".")) %>% 

समस्या दूसरा gsub है, क्योंकि यह इनपुट .... जो वास्तव में पिछले लाइन के परिणाम के लिए पूछता है।

कृपया, क्या कोई यह बता सकता है कि gsub() को पाइपलाइन के नीचे फ़ंक्शंस का उपयोग कैसे करें? बहुत बहुत धन्यवाद!

प्रणाली: आर 3.2.3, विंडोज

+1

आपके द्वारा उपयोग किए जा रहे बाहरी पैकेजों का उल्लेख करें। –

+0

हालांकि gsub के साथ आप 'df $ d <- gsub (" \\। "," ", Df $ ए)%>% str_trim()%>% str_replace (',', '।') ' –

+0

का उपयोग कर सकते हैं असल में, यह http://stackoverflow.com/questions/36716710/combining-pipes-and-the-dot-placeholder-in-r –

उत्तर

10

इस प्रयास करें:

library(stringr) 

df$D <- df$A %>% 
    { gsub("\\.","", .) } %>% 
    str_trim() %>% 
    { as.numeric(gsub(",", ".", .)) } 
पाइप अपने डेटा अगले कार्य करने के लिए एक पहले तर्क के रूप में पारित कर रहे हैं के साथ

, तो यह उपयोग करने के लिए अगर आप चाहते हैं कहीं और आपको {} में अगली पंक्ति को लपेटने की आवश्यकता है और डेटा "मार्कर" के रूप में . का उपयोग करें।

+0

आह के साथ सलाह के लिए धन्यवाद, धन्यवाद, यह मूलभूत कार्यक्षमता है जिसे मैंने याद किया। यह समझाने के लिए बहुत बहुत धन्यवाद! – user2006697

+0

याद रखें कि आप कई बार '.' का भी उपयोग कर सकते हैं। –

+0

लेकिन जैसा कि मेरे उत्तर में दिखाया गया है, '.' का उपयोग करना आवश्यक नहीं है। – ddiez

1

समस्या यह है कि पाइप में खिलाया गया तर्क तर्कों की सूची में पहला होना चाहिए। लेकिन gsub() के लिए यह मामला नहीं है, क्योंकि x तीसरा है। ए (अधिक शब्दों वाले) वैकल्पिक हल हो सकता है:

df$A %>% 
    gsub(pattern = "\\.", replacement="") %>% 
    str_trim() %>% 
    gsub(patter = ",", replacement = ".") %>% 
    as.numeric 
6

आम तौर पर एक साफ डेटा फ्रेम लौटने इस तरह एक पूरे के रूप डेटा फ्रेम करने के लिए पाइप लागू होता है। कार्यात्मक प्रोग्रामिंग का विचार यह है कि वस्तुएं अपरिवर्तनीय हैं और जगह में नहीं बदली गई हैं बल्कि नई वस्तुओं को उत्पन्न किया गया है।

library(dplyr) 

df %>% 
    mutate(C = gsub("\\.", "", A)) %>% 
    mutate(C = gsub(",", ".", C)) %>% 
    mutate(C = as.numeric(C)) 

भी ध्यान रखें कि इन विकल्पों काम: के बाद से यह दृढ़तापूर्वक एक उच्च स्तरीय हम क्या करने का इरादा क्या पर व्यक्त करता

df %>% mutate(C = gsub("\\.", "", A), C = gsub(",", ".", C), C = as.numeric(C)) 


df %>% mutate(C = read.table(text = gsub("[.]", "", A), dec = ",")[[1]]) 


df %>% mutate(C = type.convert(gsub("[.]", "", A), dec = ",")) 

इस विशिष्ट उदाहरण type.convert के लिए सबसे उपयुक्त लगता है। तुलनात्मक रूप से, gsub/as.numeric समाधान बहुत कम स्तर और वर्बोज़ लगते हैं जबकि read.table डेटा.फ्रेम में रूपांतरण जोड़ता है जिसे हमें इसे उच्च स्तर को पूर्ववत करने की आवश्यकता होती है।

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