अवतरण - विराम चिन्ह worksheets



डेटा को कैसे पढ़ा जाए जब कुछ संख्याओं में अल्पविरामक के रूप में अल्पविराम होता है? (8)

mutate_each और पाइप का उपयोग कर एक dplyr समाधान

कहें कि आपके पास निम्न है:

> dft
Source: local data frame [11 x 5]

   Bureau.Name Account.Code   X2014   X2015   X2016
1       Senate          110 158,000 211,000 186,000
2       Senate          115       0       0       0
3       Senate          123  15,000  71,000  21,000
4       Senate          126   6,000  14,000   8,000
5       Senate          127 110,000 234,000 134,000
6       Senate          128 120,000 159,000 134,000
7       Senate          129       0       0       0
8       Senate          130 368,000 465,000 441,000
9       Senate          132       0       0       0
10      Senate          140       0       0       0
11      Senate          140       0       0       0

और वर्ष चर के X2014-X2016 से अल्पविरामों को हटाना चाहते हैं, और उन्हें संख्यात्मक रूपांतरित कर सकते हैं। भी, मान लें कि X2014-X2016 कारकों के रूप में पढ़ा जाता है (डिफ़ॉल्ट)

dft %>%
    mutate_each(funs(as.character(.)), X2014:X2016) %>%
    mutate_each(funs(gsub(",", "", .)), X2014:X2016) %>%
    mutate_each(funs(as.numeric(.)), X2014:X2016)

mutate_each निर्दिष्ट कॉलम में mutate_each अंदर फ़ंक्शन (ओं) को लागू करता है

मैंने इसे अनुक्रमिक रूप से किया, एक समय में एक समारोह (यदि आप funs अंदर कई कार्यों का उपयोग करते हैं तो आप अतिरिक्त, अनावश्यक कॉलम बनाते हैं)

मेरे पास एक सीएसवी फ़ाइल है जहां कुछ संख्यात्मक मानों को अल्पविरामक के रूप में अल्पविराम के रूप में व्यक्त किया जाता है, उदाहरण के लिए 1513 बजाय "1,513" । आर में डेटा पढ़ने का सबसे आसान तरीका क्या है?

मैं read.csv(..., colClasses="character") उपयोग कर सकता हूं, लेकिन फिर मुझे उन स्तंभों को संख्यात्मक रूप से परिवर्तित करने से पहले प्रासंगिक तत्वों से कॉमा को बाहर करना होगा, और मुझे ऐसा करने का एक साफ तरीका नहीं मिल रहा है ।


आप read.table या read.csv को आपके लिए अर्द्ध स्वचालित रूप से यह रूपांतरण कर सकते हैं। सबसे पहले एक नई श्रेणी परिभाषा बनाएं, फिर एक रूपांतरण फ़ंक्शन बनाएं और इसे सेटएएस फ़ंक्शन का उपयोग करके "as" विधि के रूप में सेट करें:

setClass("num.with.commas")
setAs("character", "num.with.commas", 
        function(from) as.numeric(gsub(",", "", from) ) )

फिर read.csv चलाएं जैसे:

DF <- read.csv('your.file.here', 
   colClasses=c('num.with.commas','factor','character','numeric','num.with.commas'))

एक और समाधान:

 y <- c("1,200","20,000","100","12,111") 

 as.numeric(unlist(lapply( strsplit(y,","),paste, collapse="")))

हालांकि, यह gsub की तुलना में काफी धीमी होगी।


एक बहुत सुविधाजनक तरीका readr::read_delim । यहां से उदाहरण लेना: कई विभाजकों के साथ सीएसवी आयात करना आर में आप निम्नानुसार कर सकते हैं:

txt <- 'OBJECTID,District_N,ZONE_CODE,COUNT,AREA,SUM
1,Bagamoyo,1,"136,227","8,514,187,500.000000000000000","352,678.813105723350000"
2,Bariadi,2,"88,350","5,521,875,000.000000000000000","526,307.288878142830000"
3,Chunya,3,"483,059","30,191,187,500.000000000000000","352,444.699742995200000"'

require(readr)
read_csv(txt) # = read_delim(txt, delim = ",")

अपेक्षित परिणाम में परिणाम क्या हैं:

# A tibble: 3 × 6
  OBJECTID District_N ZONE_CODE  COUNT        AREA      SUM
     <int>      <chr>     <int>  <dbl>       <dbl>    <dbl>
1        1   Bagamoyo         1 136227  8514187500 352678.8
2        2    Bariadi         2  88350  5521875000 526307.3
3        3     Chunya         3 483059 30191187500 352444.7

मैं डेटा को प्री-प्रोसेस करने के बजाए आर का उपयोग करना चाहता हूं क्योंकि डेटा संशोधित होने पर यह आसान हो जाता है। gsub का उपयोग करने के शेन के सुझाव के बाद, मुझे लगता है कि यह उतना ही साफ है जितना मैं कर सकता हूं:

x <- read.csv("file.csv",header=TRUE,colClasses="character")
col2cvt <- 15:41
x[,col2cvt] <- lapply(x[,col2cvt],function(x){as.numeric(gsub(",", "", x))})

यदि संख्या "।" से अलग है और gsub को कॉल करने में "," (1.200.000,00) द्वारा decimals, आपको set fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))


यह सवाल कई साल पुराना है, लेकिन मैं उस पर ठोकर खा रहा हूं, जिसका अर्थ है कि शायद अन्य लोग करेंगे।

readr पुस्तकालय / पैकेज में कुछ अच्छी विशेषताएं हैं। उनमें से एक "गन्दा" कॉलम की व्याख्या करने का एक अच्छा तरीका है, जैसे।

library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
          col_types = list(col_numeric())
        )

यह प्रदान करता है

स्रोत: स्थानीय डेटा फ्रेम [4 x 1]

  numbers
    (dbl)
1   800.0
2  1800.0
3  3500.0
4     6.5

फ़ाइलों में पढ़ने पर एक महत्वपूर्ण बात: आपको या तो पूर्व-प्रक्रिया करना है, जैसे कि उपरोक्त टिप्पणी के ऊपर, या पढ़ने के दौरान आपको प्रक्रिया करना है। अक्सर, यदि आप इस तथ्य के बाद चीजों को ठीक करने का प्रयास करते हैं, तो कुछ खतरनाक धारणाएं होती हैं जिन्हें खोजना मुश्किल होता है। (यही कारण है कि फ्लैट फाइलें पहली जगह इतनी बुराई हैं।)

उदाहरण के लिए, अगर मैंने col_types ध्वजांकित नहीं किया था, तो मुझे यह मिल गया होगा:

> read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5")
Source: local data frame [4 x 1]

  numbers
    (chr)
1     800
2   1,800
3    3500
4     6.5

(ध्यान दें कि यह अब numeric बजाय एक chr ( character ) है।)

या, अधिक खतरनाक रूप से, यदि यह काफी लंबा था और प्रारंभिक तत्वों में से अधिकांश में अल्पविराम शामिल नहीं थे:

> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")

(जैसे कि पिछले कुछ तत्व दिखते हैं :)

\"5\"\n\"9\"\n\"7\"\n\"1,003"

तब आपको उस कॉमा को पढ़ने में परेशानी होगी!

> tail(read_csv(tmp))
Source: local data frame [6 x 1]

     3"
  (dbl)
1 8.000
2 5.000
3 5.000
4 9.000
5 7.000
6 1.003
Warning message:
1 problems parsing literal data. See problems(...) for more details. 

read.csv को ठीक से समझने के तरीके के बारे में निश्चित नहीं है, लेकिन आप "," को प्रतिस्थापित करने के लिए gsub का उपयोग कर सकते हैं, और उसके बाद स्ट्रिंग को numeric as.numeric परिवर्तित कर as.numeric :

y <- c("1,200","20,000","100","12,111")
as.numeric(gsub(",", "", y))
# [1]  1200 20000 100 12111

आर-हेल्प (और यहां क्यू 2 में ) पर भी इसका उत्तर दिया गया था।

वैकल्पिक रूप से, आप फ़ाइल को प्री-प्रोसेस कर सकते हैं, उदाहरण के लिए यूनिक्स में sed साथ।





csv