【问题标题】:Control digits in specific cells特定单元格中的控制数字
【发布时间】:2018-07-12 18:03:31
【问题描述】:

我有一个如下所示的表格:

+-----------------------------------+-------+--------+------+
|                                   | Male  | Female |  n   |
+-----------------------------------+-------+--------+------+
| way more than my fair share       | 2,4   | 21,6   |  135 |
| a little more than my fair share  | 5,4   | 38,1   |  244 |
| about my fair share               | 54,0  | 35,3   |  491 |
| a littles less than my fair share | 25,1  | 3,0    |  153 |
| way less than my fair share       | 8,7   | 0,7    |   51 |
| Can't say                         | 4,4   | 1,2    |   31 |
| n                                 | 541,0 | 564,0  | 1105 |
+-----------------------------------+-------+--------+------+

一切都很好,但我想做的是在最后一行中根本不显示任何数字,因为它们显示了边距(真实案例)。 RI中是否有机会操纵特定的单元格及其数字?

谢谢!

【问题讨论】:

  • 你可以用空字符串替换值,我猜?这是什么数据结构?
  • 我不确定我知道你所说的空字符串是什么意思。这是一个数据框,然后我在 Markdown 文件中使用它并使用 kable 对其进行样式设置。

标签: r digits


【解决方案1】:

您可以使用ifelse 在不同行中以不同格式输出数字,如下例所示。但是,要使最后一行中的值与前几行按位置值对齐,还需要一些额外的技巧:

library(knitr)
library(tidyverse)

# Fake data
set.seed(10)
dat = data.frame(category=c(LETTERS[1:6],"n"), replicate(3, rnorm(7, 100,20)))

dat %>% 
  mutate_if(is.numeric, funs(sprintf(ifelse(category=="n", "%1.0f", "%1.1f"), .))) %>% 
  kable(align="lrrr")
|category |    X1|    X2|    X3|
|:--------|-----:|-----:|-----:|
|A        | 100.4|  92.7| 114.8|
|B        |  96.3|  67.5| 101.8|
|C        |  72.6|  94.9|  80.9|
|D        |  88.0| 122.0|  96.1|
|E        | 105.9| 115.1| 118.5|
|F        | 107.8|  95.2| 109.7|
|n        |    76|   120|    88|

huxtable 包可以轻松地对值进行小数对齐(有关表格格式的更多信息,请参阅the Vignette):

library(huxtable)

tab = dat %>% 
  mutate_if(is.numeric, funs(sprintf(ifelse(category=="n", "%1.0f", "%1.1f"), .))) %>% 
  hux %>% add_colnames()

align(tab)[-1] = "."

tab

这是从rmarkdown 文档编织成 PDF 时的 PDF 输出的样子:

【讨论】:

  • 有点代码高尔夫? sprintf(ifelse(category=="n", "%1.0f", "%1.1f"), .)
  • 谢谢。这样可行。我真的不明白代码虽然。必须检查一下。不幸的是,我还需要第三列没有数字。任何额外的帮助将不胜感激。
  • sprintf 是一个格式化函数(详见?sprintf)。 "%1.0f" 表示没有小数位的格式,"%1.1f" 表示有一位小数的格式。您可以将"%1.0f" 格式应用于整个第三列,然后分别设置其他两个数字列的格式。更一般地说,关键思想是您将数字转换为文本字符串以输出到表格,并使用条件语句或其他行和列选择方法以您想要的方式格式化每个单元格。
  • 谢谢。但是为什么 df$n
  • 因为我猜它现在是一个角色!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2011-09-08
  • 2022-10-12
  • 1970-01-01
  • 2013-11-11
  • 2023-03-15
相关资源
最近更新 更多