假设我正在使用 R 中的一些代码,如下所示:
library(data.table)
dt <- data.table(x=c(1:200),y=rnorm(200))
probs <- c(0.1, 0.25, 0.5, 0.75, 0.9)
quantiles <- quantile(dt$y, prob=probs)
我想生成一个名为
labels
的新变量(数组或序列),其中包含分位数及其各自值的格式化字符串。假设 quantiles
打印出以下内容:
> quantiles
10% 25% 50% 75% 90%
-1.2097339 -0.6195308 -0.0155171 0.7417443 1.2982685
我将如何以编程方式从值
labels
生成 quantiles
,这样当我打印出 labels
时,它会发出这样的序列数组:
> labels
[1] "10% at -1.20" "25% at -0.61" "50% at -0.01" "75% at 0.74" "90% at 1.29"
那么您将如何将所有这些连接在一起以产生
labels
?鉴于我们有 probs
,我们可以通过使用 probs
和 quantiles
的值进行压缩来简化此过程。
我的目标是使用
labels
和包 ggplot
来标记密度函数的 x 轴,我想在其中优雅地标记分位数及其值(考虑这样的事情)。
我已经看到我可以使用内置函数以编程方式检查分位数
names
:
> names(quantiles)
[1] "10%" "25%" "50%" "75%" "90%"
我还发现我可以使用
as.vector
: 以编程方式提取分位数的值
> as.vector(quantiles)
[1] -1.2097339 -0.6195308 -0.0155171 0.7417443 1.2982685
但是我还没有找到方法将这两个东西像Python一样压缩在一起。
然后希望我对格式中的各个分位数值进行小数精度,这需要类似于在每个值上使用
sprintf("%.2f", ...)
。
序列中的每个格式化值可能会用
sprintf("%s at %.2f", q, v)
生成。
我断断续续地使用 R 已有二十年了,但我从未能够深刻地保留其中的技能。我面临的主要问题是将这两个数据的管道和人体工程学连接在一起。通过其他研究,我发现了类似于
paste0(names(quantiles), '=', unlist(quantiles), collapse=' at ')
的东西,但这并没有产生正确的结果:
> paste0(names(quantiles), '=', unlist(quantiles), collapse=' at ')
[1] "10%=-1.20973393089285 at 25%=-0.619530792386393 at 50%=-0.0155171014275248 at 75%=0.741744347748158 at 90%=1.29826846939529"
它生成单个字符串(而不是序列),并且分位数值的精度太高。
使用
sprintf
进行所有操作。
> sprintf('%s at %.2f', names(quantiles), quantiles)
[1] "10% at -1.37" "25% at -0.73" "50% at -0.02" "75% at 0.64" "90% at 1.27"