假设我正在使用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

如何通过编程从值quantiles生成labels,以便在打印输出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,我们可以通过压缩probsquantiles的值来简化这个过程.

我的目标是使用labelsggplot包来标记密度函数的x轴,其中我想优雅地将分位数及其值一起标记(think about something like this).

Zipping the Data Together

我已经看到,我可以使用内置函数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

但我没见过zipping these two things together à la Python岁的人.

String Formatting

然后需要格式中各个分位数值的小数精度,这需要类似于对每个值使用sprintf("%.2f", ...)的内容.

序列中每个格式化的值可能都会产生sprintf("%s at %.2f", q, v).


我断断续续地使用R已经有20年了,但我从来没有能够深刻地保留其中的技能.我面临的主要问题是这两个数据的管道和人体工程学连接在一起.通过其他研究,我发现了类似于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(qntls), qntls)
[1] "10% at -1.30" "25% at -0.61" "50% at -0.02" "75% at 0.63"  "90% at 1.29" 

对于情节,您可以这样做:

> par(mar=c(4, 4, 1, 1)+.1)
> plot(dens <- density(dt$y), xaxt='n', main='')
> cm <- matrixStats::colMins(dif <- abs(mapply(`-`, list(dens$x), qntls)))
> points(qntls, dens$y[apply(t(t(dif) == cm), 2, which.max)], type='h')
> mtext(sprintf('%s\n(%.2f)', names(qntls), qntls), 1, 1, at=qntls, cex=.8)

enter image description here


Data:

> library(data.table)
> set.seed(42)
> dt <- data.table(x=1:200, y=rnorm(200))
> qntls <- quantile(dt$y, prob=c(0.1, 0.25, 0.5, 0.75, 0.9))

R相关问答推荐

使用Shiny组合和显示复制和粘贴的数据

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

r替换lme S4对象的字符串的一部分

用值序列对行进行子集化,并标识序列开始的列

在R中使用数据集名称

如何在Chart_Series()中更改轴值的 colored颜色 ?

一小时满足条件的日期的 Select

在R中按行按列范围查找最大值的名称

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

当我们有多个反斜杠和/特殊字符时使用Gsubing

基于R中的间隔扩展数据集行

将具有坐标列表列的三角形转换为多个多边形

如何预测原始数据集并将值添加到原始数据集中

计算Mean by分组和绑定到R中的数据集

TidyVerse中长度不等的列结合向量

在不重复主题的情况下重新排列组

带有Bootswatch Cerulean主题的shiny 仪表板中的浏览&按钮可见性问题

通过不完全重叠的多个柱连接

如何根据顺序/序列从数据框中排除值