যখন কিছু সংখ্যায় হাজার বিভাজক হিসাবে কমা থাকে তখন ডেটা কীভাবে পড়বেন?


117

আমার কাছে একটি সিএসভি ফাইল রয়েছে যেখানে কয়েকটি সংখ্যার মান হ'ল হাজার বিভাজক হিসাবে কমা দিয়ে স্ট্রিং হিসাবে প্রকাশ করা হয়, "1,513"পরিবর্তে 1513। আর-তে ডাটা পড়ার সহজ উপায় কী?

আমি ব্যবহার করতে পারি read.csv(..., colClasses="character"), তবে তারপরে সেই কলামগুলিকে সংখ্যায় রূপান্তরিত করার আগে আমাকে প্রাসঙ্গিক উপাদানগুলির কাছ থেকে কমাগুলি বের করতে হবে এবং আমি এটি করার একটি পরিষ্কার উপায় খুঁজে পাচ্ছি না।

উত্তর:


141

read.csvএটি কীভাবে সঠিকভাবে ব্যাখ্যা করা যায় তা সম্পর্কে নিশ্চিত নন তবে আপনি এর সাথে gsubপ্রতিস্থাপন করতে ব্যবহার করতে পারেন এবং তারপরে স্ট্রিংটি ব্যবহার করে রূপান্তর করতে পারেন :","""numericas.numeric

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

এরও পূর্বে আর- সহায়তাতে উত্তর দেওয়া হয়েছিল (এবং এখানে Q2 তে ))

বিকল্পভাবে, আপনি ফাইলটি প্রাক-প্রক্রিয়া করতে পারেন, উদাহরণস্বরূপ sedইউনিক্সে।


60

আপনি আধা-স্বয়ংক্রিয়ভাবে আপনার জন্য এই রূপান্তরটি read.table বা read.csv করতে পারেন। প্রথমে একটি নতুন শ্রেণীর সংজ্ঞা তৈরি করুন, তারপরে একটি রূপান্তর ফাংশন তৈরি করুন এবং সেটএ ফাংশনটি ব্যবহার করে এটি "হিসাবে" পদ্ধতি হিসাবে সেট করুন:

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'))

3
এটি খুব সুন্দর কৌশল। এটি অন-আমদানি রূপান্তরকরণের জন্য ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ Y / N মানগুলি লজিকাল ভেক্টর ব্যবহার করে রূপান্তর করে setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] ))।
মেরেক

1
একই সমস্যা একই সমস্যা ব্যবহার । এবং যোগ করতে: কেউ হয় ব্যবহার করতে পারে setClass("num.with.commas")বা suppresMessage(setAs(.....))অনুপস্থিত শ্রেণীর সম্পর্কে বার্তা এড়ানোর জন্য।
মারেক

হাই গ্রেগ, এই সহজ কাজটি ভাগ করে নেওয়ার জন্য ধন্যবাদ। মৃত্যুদণ্ড কার্যকর হওয়ার পরে আমি নিম্নলিখিত সতর্কতাটি পাচ্ছি: পদ্ধতিতে 'জোর করে' স্বাক্ষরযুক্ত "" চরিত্র "," num.with.commas "'এর জন্য:" num.with.commas "শ্রেণীর কোনও সংজ্ঞা নেই, সমস্যাটি এখানে কী তা সম্পর্কে কোনও ধারণা, শব্দের জন্য আমার কোড শব্দ আছে?
TheGoat

আমি একই সমস্যা লিঙ্কটি পরীক্ষা করে দেখেছি যে আমার ক্লাসটি সেট করা দরকার! ঝরঝরে কৌতুক জন্য ধন্যবাদ।
TheGoat

17

আমি ডেটা প্রাক প্রক্রিয়াজাতকরণের চেয়ে আর ব্যবহার করতে চাই কারণ ডেটা সংশোধন করার সময় এটি আরও সহজ করে তোলে। শেনের ব্যবহারের পরামর্শ অনুসরণ করে gsub, আমি মনে করি এটি যতটা পরিচ্ছন্ন আমি করতে পারি প্রায় এটি:

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

কোলাগ্লাস = "চর" সমস্ত কলামগুলিকে চর হতে বাধ্য করে না যে ক্ষেত্রে 15:41 ব্যতীত অন্যগুলিও চর? সম্ভবত read.csv () কে সিদ্ধান্ত নিতে দেওয়া এবং তারপরে 15:41 কোলে থাকা রূপান্তরগুলি আপনাকে আরও 'সংখ্যক' কলামগুলি পেতে পারে।
ডার্ক এডেলবুয়েটেল

হ্যাঁ, তবে যেমনটি আমার প্রশ্নটি লক্ষ্য করা গেছে, অন্যান্য সমস্ত কলামের চরিত্র। আমি পরিবর্তে as.is = সত্য ব্যবহার করতে পারি যা আরও সাধারণ হবে। তবে ডিফল্ট আর্গুমেন্ট ব্যবহার করে read.csv () সিদ্ধান্ত নেওয়া কার্যকর নয় কারণ এটি একটি অক্ষরের মতো দেখতে এমন কোনও কিছুকে এমন একটি ফ্যাক্টারে রূপান্তরিত করবে যা সংখ্যার কলামগুলির জন্য ঝামেলা সৃষ্টি করে কারণ তারা asnnumeric () ব্যবহার করে সঠিকভাবে রূপান্তর করে না don't ।
রব হ্যান্ডম্যান

আপনার পাঠ্য সারণিতে "=" এ dec = যুক্তি নির্ধারণ করা উচিত। এটি read.csv2 এর জন্য ডিফল্ট তবে কমাটি read.csv () এ হার্ড-ওয়ার্ড হয়।
আইআরটিএফএম

15

এই প্রশ্নটি বেশ কয়েক বছর পুরনো, তবে আমি তাতে হোঁচট খেয়েছি, যার অর্থ সম্ভবত অন্যরাও করবে।

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

ফাইলগুলিতে পড়ার সময় একটি গুরুত্বপূর্ণ বিষয়: আপনাকে হয় প্রাক-প্রক্রিয়া করতে হবে, উপরের মন্তব্যটির মতো sed, অথবা পড়ার সময় আপনাকে প্রক্রিয়া করতে হবে । প্রায়শই, আপনি যদি এই বিষয়টির পরে জিনিসগুলি ঠিক করার চেষ্টা করেন তবে কিছু বিপজ্জনক অনুমান করা আছে যা খুঁজে পাওয়া শক্ত। (যে কারণে ফ্ল্যাট ফাইলগুলি প্রথমে এত খারাপ।

উদাহরণস্বরূপ, আমি যদি পতাকাটি না দিয়ে থাকি তবে আমি এটি অর্জন করতে 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

(লক্ষ্য করুন যে এটি এখন ক এর পরিবর্তে একটি chr( character) numeric)

অথবা, আরও বিপজ্জনকভাবে, যদি এটি যথেষ্ট দীর্ঘ হয় এবং প্রাথমিক উপাদানগুলির বেশিরভাগটিতে কমা থাকে না:

> 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. 

7

dplyrব্যবহার mutate_allএবং পাইপ একটি সমাধান

বলুন আপনার নিম্নলিখিত রয়েছে:

> 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_all(funs(as.character(.)), X2014:X2016) %>%
    mutate_all(funs(gsub(",", "", .)), X2014:X2016) %>%
    mutate_all(funs(as.numeric(.)), X2014:X2016)

mutate_allfunsনির্দিষ্ট কলামগুলিতে ফাংশন (গুলি) প্রয়োগ করে

আমি এটি ক্রমানুসারে করেছি, একবারে একটি ফাংশন (যদি আপনি ভিতরে একাধিক ফাংশন ব্যবহার করেন funsতবে আপনি অতিরিক্ত, অপ্রয়োজনীয় কলাম তৈরি করেন)


3
mutate_eachঅবচয় করা হয়। আপনি কি আপনার উত্তরটি আপডেট করতে চান mutate_atবা অনুরূপ?
টিটিটি

6

আর তে "প্রিপ্রোসেসি":

lines <- "www, rrr, 1,234, ttt \n rrr,zzz, 1,234,567,987, rrr"

ব্যবহার করতে পারি readLinesএকটি উপর textConnection। তারপরে অঙ্কগুলির মধ্যে থাকা কেবলমাত্র কমাগুলি সরিয়ে ফেলুন:

gsub("([0-9]+)\\,([0-9])", "\\1\\2", lines)

## [1] "www, rrr, 1234, ttt \n rrr,zzz, 1234567987, rrr"

দশমিক বিভাজক হিসাবে কমাগুলি read.csv2 (স্বয়ংক্রিয়ভাবে) বা read.table ('ডেক-প্যারামিটারের সেটিং সহ) দ্বারা পরিচালিত হতে পারে এই প্রশ্নের সাথে সরাসরি প্রাসঙ্গিক নয় এটি জানার জন্য এটি দরকারী।

সম্পাদনা: পরে আমি আবিষ্কার করেছি যে কীভাবে নতুন ক্লাস ডিজাইন করে কলক্লাস ব্যবহার করা যায়। দেখা:

সংখ্যার শ্রেণি হিসাবে কীভাবে 1000 বিভাজক দিয়ে ডিএফ লোড করবেন?


ধন্যবাদ, এটি একটি ভাল পয়েন্টার ছিল তবে এটি বেশ কয়েকটি দশমিক চিহ্ন রয়েছে এমন অঙ্কগুলির জন্য কাজ করে না, উদাহরণস্বরূপ 1,234,567.89 - একটি গুগল স্প্রেডশিট আর-তে আমদানি করার জন্য এই সমস্যাটির জন্য কাজ করতে হবে, একটি সাধারণ জন্য stackoverflow.com/a/30020171/3096626 দেখুন একাধিক দশমিক চিহ্নের জন্য কাজ করে এমন ফাংশন

4

যদি সংখ্যাটি দ্বারা পৃথক করা হয় "।" gsubআপনাকে কল করতে অবশ্যই "," (1.200.000,00) দ্বারা দশমিক এবং mustset fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))


3

খুব সুবিধাজনক উপায় হ'ল- 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

3

রিডার_ডেলিম ফাংশনটি যা রিডার লাইব্রেরির অংশ, ব্যবহার করে আপনি অতিরিক্ত প্যারামিটার নির্দিষ্ট করতে পারেন:

locale = locale(decimal_mark = ",")

read_delim("filetoread.csv", ';", locale = locale(decimal_mark = ","))

* দ্বিতীয় লাইনে সেমিকোলন মানে রিড_ডেলিম সিএসভি সেমিকোলন পৃথক মানগুলি পড়বে।

এটি কমা সহ সমস্ত সংখ্যা যথাযথ সংখ্যা হিসাবে পড়তে সহায়তা করবে।

শুভেচ্ছা সহ

মতেউজ কানিয়া


3

আমরা ব্যবহার করতে পারি readr::parse_number, কলামগুলি অবশ্যই অক্ষর হওয়া উচিত। আমরা যদি এটি একাধিক কলামের জন্য প্রয়োগ করতে চাই তবে আমরা কলামগুলি ব্যবহার করে লুপ করতে পারিlapply

df[2:3] <- lapply(df[2:3], readr::parse_number)
df

#  a        b        c
#1 a    12234       12
#2 b      123  1234123
#3 c     1234     1234
#4 d 13456234    15342
#5 e    12312 12334512

বা ব্যবহার mutate_atথেকে dplyrনির্দিষ্ট ভেরিয়েবল তা প্রযোজ্য হবে।

library(dplyr)
df %>% mutate_at(2:3, readr::parse_number)
#Or
df %>% mutate_at(vars(b:c), readr::parse_number)

উপাত্ত

df <- data.frame(a = letters[1:5], 
                 b = c("12,234", "123", "1,234", "13,456,234", "123,12"),
                 c = c("12", "1,234,123","1234", "15,342", "123,345,12"), 
                 stringsAsFactors = FALSE)

1

আমি মনে করি প্রিপ্রোসেসিংয়ের উপায়। আপনি নোটপ্যাড ++ ব্যবহার করতে পারেন যার নিয়মিত এক্সপ্রেশন প্রতিস্থাপন বিকল্প রয়েছে।

উদাহরণস্বরূপ, আপনার ফাইলটি যদি এমন হয়:

"1,234","123","1,234"
"234","123","1,234"
123,456,789

তারপরে, আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করতে "([0-9]+),([0-9]+)"এবং এটির সাথে প্রতিস্থাপন করতে পারেন\1\2

1234,"123",1234
"234","123",1234
123,456,789

তারপরে আপনি x <- read.csv(file="x.csv",header=FALSE)ফাইলটি পড়তে ব্যবহার করতে পারেন।


22
আপনি যা কিছু স্ক্রিপ্ট করতে পারেন, আপনার উচিত। এটি হাত দ্বারা করা ত্রুটির সুযোগের পাশাপাশি খুব বেশি পুনরুত্পাদনযোগ্য না হওয়ার পরিচয় দেয়।
হ্যাডলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.