r - 将千位分隔符添加到剪切功能中的级别
问题描述
我的 x 轴标签看起来像 [100000,250000],这使得乍一看很难理解数字,我希望它看起来像 [100.000,250.000],我知道 cut2 函数有一个 formatfun 参数,但我想我没有'不知道如何正确使用它。
解决方案
让我们创建一个示例来处理:
x <- cut(seq(0,1,length.out=8) + 1e6, 3)
这是一个因素。虽然在底部它是一个数字数组,但您不想格式化它的值;你想格式化它的级别,这是与它的值相关联的字符串。这是示例中级别的样子(调用head
以防止大量打印,以防x
有许多不同的级别):
(head(levels(x)))
[1] "(1000000,1000000.3]" "(1000000.3,1000000.7]" "(1000000.7,1000001]"
要格式化关卡,我们需要将它们分成它们的数字组件(用逗号“,”分隔),格式化每个组件,然后重新组合结果。
这是一次性的分拣和格式化步骤,仅使用基本R
功能。它在第一行调用gsub
and strsplit
(用于清除“(”和“]”字符并将每对数字字符串分成两个字符串)并prettyNum
在第二行调用(用于格式化),它可以方便地格式化任何字符串看起来像一个数字:
s <- lapply(strsplit(gsub("]|[(]", "", levels(x)), ","),
prettyNum, big.mark=".", decimal.mark=",", input.d.mark=".", preserve.width="individual")
(您可能不需要该input.d.mark
参数,但我这样做是因为我的语言环境使用“。”作为小数点,如您在上面看到的。文档说“个人”是设置输出宽度的默认值,但事实并非如此我系统上的情况:我必须明确指定它。)
这些paste*
函数将执行重组,我们只需将其结果重新分配给 的级别x
:
levels(x) <- paste0("(", sapply(s, function(a) paste0(a, collapse="; ")), "]")
(由于每个数字可能已经包含“,”和“。”分隔符,我指定了第三个标点符号“;”来分隔数字本身——但当然,你可以使用你想要的。)
让我们显示新级别以验证结果:
(head(levels(x)))
[1] "(1.000.000; 1.000.000,3]" "(1.000.000,3; 1.000.000,7]" "(1.000.000,7; 1.000.001]"
推荐阅读
- pyspark - Pyspark 写入 CSV 始终写为整数类型
- android - 手动输入时日期选择器显示错误日期
- docker - 运行撰写 yml 文件 docker-compose.yml 的 Docker 堆栈部署命令错误
- java - 使短信中的某些文本能够在 android 上弹出复制选项
- javascript - 溢出正在父 div 后面发送下拉列表,z-index 不起作用
- python - 如何将此函数转换为 python 中的列表理解?
- r - 使用 ggraph 绘制双连词共现时出现问题,某些行不显示
- json - Angular4中的嵌套JSON循环
- postgresql - PostgreSQL 安装在 5432 端口
- swift - SwiftSoup 将正文中的文本包装到 div