আর-তে সংখ্যার শতাংশ হিসাবে কীভাবে বিন্যাস করবেন?


135

আর এর কাছে নতুন হিসাবে আমাকে বিভ্রান্ত করতে যে জিনিসগুলির একটি ছিল সেটি কীভাবে মুদ্রণের জন্য শতাংশ হিসাবে কোনও সংখ্যাকে ফর্ম্যাট করা যায়।

উদাহরণস্বরূপ, 0.12345হিসাবে প্রদর্শিত 12.345%। এর জন্য আমার বেশ কয়েকটি কাজের ক্ষেত্র রয়েছে তবে এগুলির কোনওটিই "নতুন বন্ধুবান্ধব" বলে মনে হয় না। উদাহরণ স্বরূপ:

set.seed(1)
m <- runif(5)

paste(round(100*m, 2), "%", sep="")
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"

sprintf("%1.2f%%", 100*m)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"

প্রশ্ন: এটি করার জন্য একটি বেস আর ফাংশন আছে? বিকল্পভাবে, এমন কোনও বহুল ব্যবহৃত প্যাকেজ যা সুবিধাজনক মোড়ক সরবরাহ করে?


এর মতো কিছু সন্ধান করা সত্ত্বেও ?format, ?formatCএবং ?prettyNumএখনও বেস বেসে উপযুক্ত সুবিধাজনক মোড়কের সন্ধান ??"percent"পাইনি। library(sos); findFn("format percent")1250 হিট দেয় - তাই আবার দরকারী না not ggplot2একটি ফাংশন আছে percentকিন্তু এটি গোলাকার নির্ভুলতার উপর কোনও নিয়ন্ত্রণ দেয় না।


5
sprintfমেলিং তালিকাগুলির পছন্দের সমাধান বলে মনে হচ্ছে এবং এর থেকে ভাল সমাধান আমি আর দেখেনি। কোনও অন্তর্নির্মিত ফাংশন যাইহোক কল করা খুব সহজ হবে না, তাই না?
মিশেল-স্ল্যাম

1
আমার দৃষ্টিতে sprintfআর কোডারগুলির সাবসেটের জন্য পুরোপুরি ঠিক আছে যা প্রোগ্রামার হতে পারে। আমি আমার জীবনে প্রচুর কোডিং করেছি, সহ সিবিওএল (কাঁপানো) এবং ফোর্টারান (আমার বয়স দেখায়)। তবে আমি sprintfফর্ম্যাটিংয়ের নিয়মগুলি সুস্পষ্ট বিবেচনা করি না (অনুবাদ: ডাব্লুটিএফ?)। এবং অবশ্যই একটি ডেডিকেটেড format_percent(x=0.12345, digits=2)
র‍্যাপারটি স্প্রিন্টফের

@ হিরকাস আমি মনে করি এটি যথেষ্ট সাধারণ যে এটি তার নিজস্ব শর্ট ক্রিড ফাংশনটির প্রাপ্য। এটি বিশেষত সোয়েভের একটি সমস্যা, যেখানে \ সেক্সপ্রপ {স্প্রিন্টফ (% 1.2f %% ", মাইভার) \ \ সেক্সপ্রপ {পিটিটি (মাইভার) than বা তার চেয়ে ছোট সংক্ষিপ্ত কার্যটি যা হবে তার চেয়ে অনেক খারাপ}
অরি বি ফ্রিডম্যান

2
উপযুক্ত সরঞ্জামগুলি ব্যবহার করা শিখাই কি এমন কিছু ব্যবহার করা উচিত যা আমাদের ব্যবহারকারীদের পক্ষে চেষ্টা করা উচিত? আমি বলতে চাইছি sprintf()যে প্যাকেজ ফু রয়েছে তা জানার চেয়ে ব্যবহার করা শেখা খুব বেশি সময় ব্যয়কারী format_percent()। ব্যবহারকারী যদি শতাংশ হিসাবে ফর্ম্যাট করতে না চান তবে এর মতো অন্য কিছু হয়? তাদের অন্য একটি মোড়ক খুঁজে পাওয়া দরকার। দীর্ঘমেয়াদে বেস সরঞ্জামগুলি শেখা উপকারী হবে।
গ্যাভিন সিম্পসন

1
এতে একটি সামান্য সমস্যা রয়েছে %ল্যাটেক্সে মন্তব্য চরিত্রটি, যা আর এর জন্য "ডিফল্ট" প্রতিবেদনের ফর্ম্যাট So
জেমস

উত্তর:


118

এমনকি পরে:

@ ডিজিমিট্রি এম দ্বারা নির্দেশিত হিসাবে, percent()"অবসরপ্রাপ্ত" হয়ে গেছে , এটি label_percent()পুরানো percent_format()ফাংশনের প্রতিশব্দ ।

label_percent() একটি ফাংশন দেয়, তাই এটি ব্যবহার করতে আপনার একটি অতিরিক্ত জোড়া বন্ধনী প্রয়োজন।

library(scales)
x <- c(-1, 0, 0.1, 0.555555, 1, 100)
label_percent()(x)
## [1] "-100%"   "0%"      "10%"     "56%"     "100%"    "10 000%"

প্রথম বন্ধনীর প্রথম সেটটির মধ্যে যুক্তি যুক্ত করে এটি কাস্টমাইজ করুন।

label_percent(big.mark = ",", suffix = " percent")(x)
## [1] "-100 percent"   "0 percent"      "10 percent"    
## [4] "56 percent"     "100 percent"    "10,000 percent"

একটি আপডেট, বেশ কয়েক বছর পরে:

এই দিনগুলিতে প্যাকেজটিতে একটি percentক্রিয়াকলাপ রয়েছে scales, যেমন krlmlr এর উত্তরে নথিবদ্ধ। আমার হাত ঘূর্ণিত সমাধানের পরিবর্তে এটি ব্যবহার করুন।


এরকম কিছু চেষ্টা করুন

percent <- function(x, digits = 2, format = "f", ...) {
  paste0(formatC(100 * x, format = format, digits = digits, ...), "%")
}

ব্যবহার সহ, যেমন,

x <- c(-1, 0, 0.1, 0.555555, 1, 100)
percent(x)

(যদি আপনি চান, থেকে বিন্যাস পরিবর্তন "f"করার জন্য "g"।)


2
হ্যাঁ, এটি কাজ করে, এবং আমি যে প্রশ্নটি সরবরাহ করেছি তার সামান্যতর সাধারণ সংস্করণ। তবে আমার আসল প্রশ্নটি এটি বেস আরে আছে কি নেই।
অ্যান্ড্রি

পার্সেন্টের তালিকা তৈরিতে আমার পক্ষে কাজ করে তবে একটি পরিসংখ্যানগত বা গ্রাফিং কমান্ডে "x" এর পরিবর্তে "শতাংশ (x)" দিয়ে একটি ত্রুটি বার্তা তৈরি করে।
Rolando2

@ রোল্যান্ডো 2 আমার উত্তর এবং krlmlr এর উত্তর উভয়ই আউটপুট হিসাবে অক্ষরের ভেক্টরগুলি দেখায়, সংখ্যা নয়। এগুলি অক্ষ লেবেল এবং এর মতো বিন্যাস করার জন্য। সম্ভবত আপনি 100 দ্বারা গুণ করতে চান?
রিচি কটন

2020 হিসাবে scalesVer। 1.1.0 ম্যানুয়ালটি বলে: percent()অবসরপ্রাপ্ত; label_percent()পরিবর্তে এটি ব্যবহার করুন, যা সংখ্যা বিন্যাসের জন্য উপযুক্ত নয় । যাতে হাত দ্বারা ঘূর্ণিত
দ্রবণটি

74

পরীক্ষা করে দেখুন scalesপ্যাকেজ। ggplot2আমি মনে করি এটির একটি অংশ ছিল ।

library('scales')
percent((1:10) / 100)
#  [1] "1%"  "2%"  "3%"  "4%"  "5%"  "6%"  "7%"  "8%"  "9%"  "10%"

নির্ভুলতা সনাক্ত করার জন্য অন্তর্নির্মিত যুক্তি বেশিরভাগ ক্ষেত্রে সঠিকভাবে কাজ করা উচিত।

percent((1:10) / 1000)
#  [1] "0.1%" "0.2%" "0.3%" "0.4%" "0.5%" "0.6%" "0.7%" "0.8%" "0.9%" "1.0%"
percent((1:10) / 100000)
#  [1] "0.001%" "0.002%" "0.003%" "0.004%" "0.005%" "0.006%" "0.007%" "0.008%"
#  [9] "0.009%" "0.010%"
percent(sqrt(seq(0, 1, by=0.1)))
#  [1] "0%"   "32%"  "45%"  "55%"  "63%"  "71%"  "77%"  "84%"  "89%"  "95%" 
# [11] "100%"
percent(seq(0, 0.1, by=0.01) ** 2)
#  [1] "0.00%" "0.01%" "0.04%" "0.09%" "0.16%" "0.25%" "0.36%" "0.49%" "0.64%"
# [10] "0.81%" "1.00%"

2
নেতিবাচক সংখ্যার জন্য কাজ করে না। percent(-0.1)উত্পাদনNaN%
আখমেড

1
@খমেদ: এটি ইতিমধ্যে প্রতিবেদন করা হয়েছে, একটি ফিক্স পাওয়া যায় তবে পর্যালোচনা মুলতুবি: github.com/hadley/scales/issues/50 । মনে রাখবেন যে এটি একাধিক নেতিবাচক সংখ্যার জন্য কাজ করছে বলে মনে হচ্ছে:scales::percent(c(-0.1, -0.2))
krlMLr

লিঙ্কের জন্য ধন্যবাদ! আমি নিশ্চিত ছিলাম না এটি কোনও বৈশিষ্ট্য বা বাগ is একাধিক সংখ্যার জন্য এটি কখনও কখনও কাজ করে এবং কখনও কখনও তা করে না। বলুন, scales::percent(c(-0.1,-0.1,-0.1))উত্পাদন করে "NaN%" "NaN%" "NaN%"কিন্তু আপনার উদাহরণ কাজ করে। অন্যের উল্লেখের জন্য, বাগটি এখনও পর্যন্ত ঠিক করা হয়নি scales_0.2.4। এছাড়াও, আজকের হিসাবে, সম্পর্কিত পুল অনুরোধ এটি স্থির করে এখনও মূল শাখায় মার্জ করা হয়নি।
এখমেড

34

প্যাকেজ percentথেকে ফাংশনটি দেখুন formattable:

library(formattable)
x <- c(0.23, 0.95, 0.3)
percent(x)
[1] 23.00% 95.00% 30.00%

4
+1, এটি কতগুলি সংখ্যা অন্তর্ভুক্ত করবে তা নির্দিষ্ট করার জন্য অনুমতি দেয় যা scales::percentপ্রথম দুটি উত্তরে উত্তর দেয় না।
স্যাম ফির্ক 18

3
আপনার নিজের ফাংশনটি রোল করা বেশ সহজ যদিও +1, অঙ্কের সংখ্যা বাছাই করা সত্যই দরকারী।
গ্যাং সু

10

আমি কিছু এই উত্তরগুলোর উপর গতির জন্য মাপকাঠিতে এবং দেখতে বিস্মিত করেনি percentমধ্যে scales, প্যাকেজ তাই দালালি তার ঢিলা দেওয়া। আমি কল্পনা করি সুবিধাটি হ'ল যথাযথ ফর্ম্যাটের জন্য এটি স্বয়ংক্রিয় সনাক্তকারী, তবে আপনি যদি জানেন যে আপনার ডেটা কেমন দেখাচ্ছে তবে এড়ানো এড়ানো পরিষ্কার বলে মনে হচ্ছে।

এখানে 100,000 শতাংশের একটি তালিকা (0,1) -এর তালিকা 2 শতাংশে শতাংশে ফর্ম্যাট করার চেষ্টা করা ফলাফলগুলি এখানে রয়েছে:

library(microbenchmark)
x = runif(1e5)
microbenchmark(times = 100L, andrie1(), andrie2(), richie(), krlmlr())
# Unit: milliseconds
#   expr       min        lq      mean    median        uq       max
# 1 andrie1()  91.08811  95.51952  99.54368  97.39548 102.75665 126.54918 #paste(round())
# 2 andrie2()  43.75678  45.56284  49.20919  47.42042  51.23483  69.10444 #sprintf()
# 3  richie()  79.35606  82.30379  87.29905  84.47743  90.38425 112.22889 #paste(formatC())
# 4  krlmlr() 243.19699 267.74435 304.16202 280.28878 311.41978 534.55904 #scales::percent()

সুতরাং sprintfআমরা যখন একটি শতাংশ চিহ্ন যোগ করতে চাই তখন স্পষ্ট বিজয়ী হিসাবে আবির্ভূত হয়। অন্যদিকে, আমরা যদি কেবল সংখ্যা এবং রাউন্ডকে ("%" ছাড়াই শতাংশের অনুপাতে যেতে চাই) তবে round()দ্রুততম:

# Unit: milliseconds
#        expr      min        lq      mean    median        uq       max
# 1 andrie1()  4.43576  4.514349  4.583014  4.547911  4.640199  4.939159 # round()
# 2 andrie2() 42.26545 42.462963 43.229595 42.960719 43.642912 47.344517 # sprintf()
# 3  richie() 64.99420 65.872592 67.480730 66.731730 67.950658 96.722691 # formatC()

8

আপনি কেবলমাত্র এই অপারেশনের জন্য স্কেল প্যাকেজটি ব্যবহার করতে পারেন (এটি প্রয়োজনীয় বা লাইব্রেরি সহ লোড না করে)

scales::percent(m)

1
অঙ্কের সংখ্যার জন্য নির্ভুলতা কীভাবে দেওয়া যায়?
Elmex80s

6

একটি নতুন ফাংশন সংজ্ঞায়িত করার জন্য আমার সমাধানটি এখানে রয়েছে (বেশিরভাগ ক্ষেত্রে আমি কারি এবং রচনা :-) দিয়ে খেলতে পারি):

library(roxygen)
printpct <- Compose(function(x) x*100, Curry(sprintf,fmt="%1.2f%%"))

3

scalable::percentইতিমধ্যে কীভাবে আস্তে আস্তে দেখানো হয়েছিল এবং লিলিয়ানা পাচেকো আরও একটি সমাধান দেওয়ার প্রস্তাব দিয়েছিল, আমি এগিয়ে গিয়ে মাইকেল সেটটির উদাহরণের ভিত্তিতে অন্য কয়েকটি বিকল্পের বিপরীতে এটিকে বেঞ্চমার্ক করার চেষ্টা করেছি:

library(microbenchmark)
library(scales)
library(formattable)

x<-runif(1e5)

lilip <- function() formattable::percent(x,2)
krlmlr <- function() scales::percent(x)
andrie1 <- function() paste0(round(x,4) * 100, '%')

microbenchmark(times=100L,lilip(), krlmlr(), andrie1())

এগুলি আমি পেয়েছি ফলাফল:

Unit: microseconds
      expr        min          lq        mean      median          uq        max neval
   lilip()    194.562    373.7335    772.5663    889.7045    950.4035   1611.537   100
  krlmlr() 226270.845 237985.6560 260194.9269 251581.0235 280704.2320 373022.180   100
 andrie1()  87916.021  90437.4820  92791.8923  92636.8420  94448.7040 102543.252   100

আমার কোনও ধারণা নেই যদিও মাইকেলচিরিকোর উদাহরণের চেয়ে আমার krlmlr()এবং কেন andrie1()এত খারাপ অভিনয় করেছে। কোন সংকেত সনাক্ত করুন?


0
try this~

data_format <- function(data,digit=2,type='%'){
if(type=='d') {
    type = 'f';
    digit = 0;
}
switch(type,
    '%' = {format <- paste("%.", digit, "f%", type, sep='');num <- 100},
    'f' = {format <- paste("%.", digit, type, sep='');num <- 1},
    cat(type, "is not a recognized type\n")
)
sprintf(format, num * data)
}

0

এই ফাংশনটি কলামগুলি দ্বারা ডেটা শতাংশে রূপান্তর করতে পারে

percent.colmns = function(base, columnas = 1:ncol(base), filas = 1:nrow(base)){
    base2 = base
    for(j in columnas){
        suma.c = sum(base[,j])
        for(i in filas){
            base2[i,j] = base[i,j]*100/suma.c
        }
    }
    return(base2)
}

বেসিক পাটিগণিতটি ভেক্টরাইজড --- লুপের জন্য অভ্যন্তরটি অদক্ষ এবং অপ্রয়োজনীয়। সঙ্গে প্রতিস্থাপন করা যেতে পারে base2[, j] = base[ , j] * 100 / suma.c। এছাড়াও লক্ষণীয় যে এটি প্রশ্নের ঠিক উত্তর নয় ... প্রশ্নটি 0.5"50.0%" এর মতো কিছু ফর্ম্যাট করার বিষয়ে, কোনও গণনা করার বিষয়ে নয় ...
গ্রেগর থমাস

0

tidyverseসংস্করণ এই হল:

> library(tidyverse)

> set.seed(1)
> m <- runif(5)
> dt <- as.data.frame(m)

> dt %>% mutate(perc=scales::percent(m,accuracy=0.001))
          m    perc
1 0.2655087 26.551%
2 0.3721239 37.212%
3 0.5728534 57.285%
4 0.9082078 90.821%
5 0.2016819 20.168%

যথারীতি পরিপাটি লাগছে।

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