逻辑和字符百分比的行为
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
formattable
和 units
这两个软件包各有千秋,但方向不同。
我使用 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
formattable
和 units
这两个软件包各有千秋,但方向不同。