我正在使用prettyNum
与xtable
结合使用来生成漂亮的LaTeX表。当我在data.frame
中有多行时,它按预期工作。但是当我只有一行时它会失败,因为prettyNum
会将data.frame
转换为字符向量。
是否有类似于“drop = FALSE
”的简单方法来保留data.frame
中的prettyNum
?
df <- data.frame(a = 1, b ='a')
prettyDf <- prettyNum(df)
class(prettyDf)
[1] "character"
答案 0 :(得分:0)
您可以使用两种基本选项:在使用xtable
之前将输出转换为单行矩阵,或者您可以使用apply
转换为prettyNum
。
这是一个最小的例子:
首先,一些样本数据。一行data.frame
和三行data.frame
:
df <- structure(
list(V1 = 76491283764.9743, V2 = 29.12345678901, V3 = -7.1234, V4 = -100.1,
V5 = 1123), .Names = c("V1", "V2", "V3", "V4", "V5"),
row.names = c(NA, -1L), class = "data.frame")
df
# V1 V2 V3 V4 V5
# 1 76491283765 29.12346 -7.1234 -100.1 1123
df2 <- rbind(df, df*2, df*3)
df2
# V1 V2 V3 V4 V5
# 1 76491283765 29.12346 -7.1234 -100.1 1123
# 2 152982567530 58.24691 -14.2468 -200.2 2246
# 3 229473851295 87.37037 -21.3702 -300.3 3369
在3行上使用xtable
可以正常使用 ,但与您在问题中所说的不同,它不会保留data.frame
。它将输出转换为字符矩阵。 :
> class(prettyNum(df2, big.mark=","))
[1] "matrix"
> xtable(prettyNum(df2, big.mark=","), align = "rrrrrr")
% latex table generated in R 2.15.3 by xtable 1.7-1 package
% Fri Mar 22 15:46:08 2013
\begin{table}[ht]
\centering
\begin{tabular}{rrrrrr}
\hline
& V1 & V2 & V3 & V4 & V5 \\
\hline
1 & 76,491,283,765 & 29.12346 & -7.1234 & -100.1 & 1,123 \\
2 & 152,982,567,530 & 58.24691 & -14.2468 & -200.2 & 2,246 \\
3 & 229,473,851,295 & 87.37037 & -21.3702 & -300.3 & 3,369 \\
\hline
\end{tabular}
\end{table}
在1行data.frame上尝试相同的操作会给我们一个错误,因为在“美化”你的数字的过程中,data.frame成为一个命名的字符向量,正如你已经想到的那样:
> xtable(prettyNum(df, big.mark = ","), align = "rrrrrr")
Error in UseMethod("xtable") :
no applicable method for 'xtable' applied to an object of class "character"
使用methods(xtable)
查看已定义xtable
方法的对象类型。要查看特定方法(例如,xtable.data.frame
方法),请使用xtable:::xtable.data.frame
。从那里,如果您认为有必要,您可以学习如何编写自己的方法。
然而,在这种情况下,没有必要。只需尝试以下选项之一,注意它们之间的细微差别:
xtable(matrix(prettyNum(df, big.mark = ","), nrow = 1), align = "rrrrrr")
xtable(t(apply(df, 1, prettyNum, big.mark = ",")), align = "rrrrrr")
以下是一些示例输出: