逻辑和字符百分比的行为

时间:2017-06-14 20:30:37

标签: r percentage

我使用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%之间的值,这不起作用。

这到底发生了什么?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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都有自己的优点,但它们朝着不同的方向发展。