【问题标题】:Formatting markdown table with numeric and integer columns使用数字和整数列格式化降价表
【发布时间】:2017-08-22 12:02:02
【问题描述】:

knitr::kable() 如何忽略格式化整数列并格式化所有其他数字列?

例子:

knitr::kable(x = as.data.frame(rbind(c(1L, 21.211), c(2L, 31.233))), format.args = list("digits" = 2, "nsmall" = 2, "big.mark" = ".", "decimal.mark" = ",", "scientific" = FALSE))

返回:

[1] "| V1| V2|" "|----:|-----:|" "| 1,00| 21,21|" "| 2,00| 31,23|"

我的输出是这样的:

[1] "| V1| V2|" "|----:|-----:|" "| 1| 21,21|" "| 2| 31,23|"

谢谢

【问题讨论】:

  • 感谢您的回复。但我正在寻找一种更“自动化”的方法。也许可以根据上述帖子编写一些可以处理此问题的逻辑。

标签: r markdown knitr


【解决方案1】:

knitr::kable 始终将相同的格式应用于所有数字列,因此您唯一的选择是在调用它之前将其转换为字符列,正如 J_F 的参考所建议的那样。

我怀疑它是否可以完全自动化。您开始使用的数据框只有 numeric 列; integer 值由 c() 转换为 numeric。 (您可以通过不同的方式构建数据框来避免这种情况。)假设您有某种方法可以构建一个向量来指示您希望以哪种方式格式化哪些列,您可以自动执行以下操作:

df <- as.data.frame(rbind(c(1L, 21.211), c(2L, 31.233)))
intcolumn <- c(TRUE, FALSE)  # This is hard to automate

for (i in seq_len(ncol(df))) {
  if (intcolumn[i])
    df[[i]] <- format(df[[i]])
  else
    df[[i]] <- format(df[[i]], digits = 2, nsmall = 2, big.mark = ".", 
                      decimal.mark = ",", scientific = FALSE)
}
knitr::kable(df, align = "r") # right align as for numeric column

这会产生

| V1|    V2|
|--:|-----:|
|  1| 21,21|
|  2| 31,23|

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多