逻辑和字符百分比的行为

Behavior on logicals and character percentages

我使用 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 说:Value: percent returns a character vector。如果你问 percent(x) < percent(c(.5)) 比你问 字符串比较 ,并且字符串 250% 确实比字符串 50% 小,因为 2 排在 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%

编辑: 一样,units 包也接受 % 等许多其他测量单位,但我发现它的使用不太方便特定目的:

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 这两个软件包各有千秋,但方向不同。