【问题标题】:Behavior on logicals and character percentages逻辑和字符百分比的行为
【发布时间】:2017-06-14 20:30:37
【问题描述】:

我使用scales 将向量格式化为percentage 格式,并且在对此运行逻辑运算方面取得了很大的成功,但是,我注意到一些高于两位数百分比的有趣行为,我想知道是否有人可以解释这样我就可以避免这些情况。

示例向量:

library(scales)
x <- c(.2,.4,.6,.8,1.2,2.0,2.5,5.1)
> percent(x)
[1] "20%"  "40%"  "60%"  "80%"  "120%" "200%" "250%" "510%"
percent(x) < percent(c(.5))
[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE

如您所见,低于 100% 的值被正确识别为小于或不小于 50%。但是,这不适用于 100-499% 之间的值。

这里到底发生了什么?

【问题讨论】:

  • percent 的结果是一个字符,而不是一个数字对象。所以它是按字典顺序比较值,而不是按数字。

标签: r percentage


【解决方案1】:

帮助功能?percent 说:Value: percent returns a character vector。如果你问percent(x) &lt; percent(c(.5))而不是问字符串比较,而字符串250%确实小于字符串50%,因为2之前5(字典排序)

【讨论】:

    【解决方案2】:

    formattable 包可让您完全按照自己的意愿行事:将数字打印为百分比,但仍然可以进行计算。

    library(formattable)
    x <- c(.2,.4,.6,.8,1.2,2.0,2.5,5.1)
    percent(x)
    #[1] 20.00%  40.00%  60.00%  80.00%  120.00% 200.00% 250.00% 510.00%
    percent(x) < percent(c(.5))
    #[1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    

    请注意,这正是问题中的代码,除了 library(scales) 已被 library(formattable) 替换。

    introductory vignette 提供了更多示例,例如,

    p <- percent(c(0.1, 0.02, 0.03, 0.12))
    p
    #[1] 10.00% 2.00%  3.00%  12.00%
    p * 1.1
    #[1] 11.00% 2.20%  3.30%  13.20%
    p + 0.02
    #[1] 12.00% 4.00%  5.00%  14.00%
    p + percent(0.02)
    #[1] 12.00% 4.00%  5.00%  14.00%
    

    可以控制打印格式,例如,

    percent(x, digits = 0L)
    #[1] 20%  40%  60%  80%  120% 200% 250% 510%
    percent(x, format = "d")
    #[1]  20%  40%  60%  80% 120% 200% 250% 509%
    

    也可以转换字符:

    p <- percent(c("15.5%", "25.12%", "73.5"))
    p
    #[1] 15.50%   25.12%   7350.00%
    p / 10
    #[1] 1.55%   2.51%   735.00%
    

    编辑:作为suggested by Alistaireunits 包也接受% 以及许多其他测量单位,但我发现它的使用不太方便对于特定目的

    library(units)
    set_units(100*x, `%`)
    Units: %
    #[1]  20  40  60  80 120 200 250 510
    set_units(100*x, `%`) < set_units(100*.5, `%`)
    #[1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    
    p <- set_units(100*c(0.1, 0.02, 0.03, 0.12), `%`)
    p
    #Units: %
    #[1] 10  2  3 12
    p * 1.1
    #Units: %
    #[1] 11.0  2.2  3.3 13.2
    p + 0.02
    #Error in Ops.units(p, 0.02) : 
    #  both operands of the expression should be "units" objects
    p + set_units(100*0.02, `%`)
    #Units: %
    #[1] 12  4  5 14
    

    formattableunits 这两个软件包各有各的优点,但正朝着不同的方向发展。

    【讨论】:

    • units 包对这类事情也很有用
    • @alistaire 我已采纳您的建议并编辑了我的答案。但我发现units 包不太适合这个特定问题。
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2010-12-24
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多