【问题标题】:xtable - digits in data.frame that also contains stringsxtable - data.frame 中还包含字符串的数字
【发布时间】:2015-10-01 11:14:48
【问题描述】:

我有一个包含数字和字符串的 data.frame,我想控制 xtable 打印中的数字。出于某种原因,xtable 似乎忽略了digits=2 命令。见:

\documentclass{article}
\begin{document}

<<echo=F, results='asis'>>=
library("xtable")
df <- data.frame(matrix( c("aaa", "bbb", seq(0.1, 1, length.out=6) ), 2, 4) )

print(xtable(df, digits=2))
print(xtable(df, digits=c(0, 0, 2, 2, 2)))
@
\end{document}

这两个打印都不会影响输出中的位数,即都抑制逗号后面的零,例如0.1 和 1。我希望它分别为 0.10 和 1.00,这样所有数字的长度都相同。

digits=2 命令在 data.frame 中没有字符串时完美运行。见:

df2 <- data.frame(matrix( seq(0.1, 1, length.out=6), 2, 3) )
print(xtable(df2, digits=2))

我正在寻找的是一种在 xtable 中打印 data.frame 的方法,其中包含所有数值的数字为 2 的字符串。

有人知道解决办法吗?

【问题讨论】:

    标签: r knitr digits xtable


    【解决方案1】:

    在您的示例中,您从字符矩阵创建数据框,其中每一列都是一个字符。 Xtable 不知道如何将数字应用于字符。尝试从一开始就将您的 data.frame 定义为 data.frame,然后数字列将是数字,而字符列将是字符。这应该有效:

    df <- data.frame(X1 = c("aaa", "bbb"),X2 = c(0.1,0.28),X3 = c(0.46,0.64), X4 = c(0.82, 1))
    print(xtable(df, digits=2)) 
    

    根据要求,一种将全字符数据框转换为字符和数字列混合的快速方法:

    df[] <- lapply(df, function(x) if (anyNA(y <- as.numeric(x))) x else y)
    

    data.table 包中的另一个更优雅的解决方案:

    library(data.table)
    setDT(df)[, lapply(.SD, function(x) if(anyNA(y <- as.numeric(x))) x else y)]
    

    【讨论】:

    • 太好了,谢谢,这解释了问题出在哪里。我有一个包含许多列的数字矩阵,这将使得将每一列分别添加到 df 中需要大量输入。你知道在定义字符data.frame之后分配列类型的好方法吗?
    • 我在原始答案中添加了快速方法来做到这一点
    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2013-05-07
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多