R stargazer:不同的小数位数

3
我在R中遇到了stargazer输出的问题。
以下是我的原始数据框:
Rank  p     LMax   10%   5%  1%   
var1  0.427  24.25 21.8 27.4 31.5
var2  0.228  7.23  11.5 12.2 16.7

星空观察者创建的内容:
stargazer(data_summary, summary=FALSE, digits = 3)
Rank  p      LMax   10%    5%     1%   
var1  0.427  24.250 21.800 27.400 31.500
var2  0.248  7.230  11.500 12.200 16.700

“保持 p 的三位数字,其他数字保留两位是很重要的。将 digits=2 不是解决问题的方法,因为这样 p 只有两位数字。”
“期望的输出:”
Rank  p      LMax   10%    5%     1%   
var1  0.427  24.25 21.80 27.40 31.50
var2  0.248  7.23  11.50 12.20 16.70

有什么想法解决这个问题吗?

如果列是数字,您可以使用以下代码:dat[3:5] <- round(dat[3:5], 2) - Rentrop
我知道我可以操作数据框,但是不知为何stargazer只能对所有值应用一个小数结构?我希望它能够直接打印出数据框,就像它本来的样子一样。 - RPacker
如果您想要原始数据框“按原样”打印,为什么不使用digits = NA呢?根据stargazer手册,这应该完全放弃四舍五入。我相信完全省略整个数字参数可能会产生相同的结果。 - Olli J
1
@OlliJ,看到了,但它回复说“paste(first.part, .format.decimal.character, decimal.part, sep = "")中的错误:对象'decimal.part'未找到”。 - RPacker
同样的问题在这里! - RPacker
2个回答

2
一种简单的解决方案是将您的数据框转换为字符向量,每个向量保留相应数量的小数位。将“Original Answer”翻译成“最初的回答”。
data_summary <- read.table(text = "
Rank  p     LMax   p10   p5  p1   
var1  0.427  24.25 21.8 27.4 31.5
var2  0.228  7.23  11.5 12.2 16.7", header = TRUE, stringsAsFactors = FALSE)

我们编写一个匿名函数,该函数接受一个整数x(小数点位数)和一个数字向量y,并返回一个字符向量:

最初的回答:

out <- mapply(function(x, y) sprintf(sprintf("%%.0%if", y), x), 
  data_summary[-1],
  c(3, 2, 2, 2, 2))
#      p       LMax    p10     p5      p1     
# [1,] "0.427" "24.25" "21.80" "27.40" "31.50"
# [2,] "0.228" "7.23"  "11.50" "12.20" "16.70"

将值绑定到行标签:

最初的回答

data_summary_out <- as.data.frame(cbind(data_summary[, 1], out))
data_summary_out <- setNames(data_summary_out, names(data_summary))

stargazer现在提供您所需的输出:

最初的回答已经得到改进。
library(stargazer)
stargazer(data_summary_out,
          type = "text",
          summary = FALSE,
          digits = NA)
# ====================================
#   Rank   p   LMax   p10   p5    p1  
# ------------------------------------
# 1 var1 0.427 24.25 21.80 27.40 31.50
# 2 var2 0.228 7.23  11.50 12.20 16.70
# ------------------------------------

你是如何从 out 转换为 data_summary_out 的?我猜是用了 bind_cols() 函数吧?顺便说一下,非常感谢你提供的解决方案,太棒了。 - Jeremy K.
因为当我使用bind_cols()时,我不断收到一个错误消息:“参数2必须有名称”。我正在尝试将out的名称复制到data_summary中,但遇到一些麻烦。 - Jeremy K.
1
我在回答中跳过了几个步骤。请查看编辑。 - Weihuang Wong

0

@weihuangwong的解决方案很好,但可以进一步精简。简单的方法是,如果您的表格每列已经具有所需的有效数字个数,则使用digits = NA参数。 因此,适应原始示例:

stargazer(data_summary, summary=FALSE, digits = NA)

根据stargazer的文档:

NA的值表示根本不应进行舍入,并且应报告所有可用的小数位。

如果您的列还没有按所需数字个数四舍五入,除了到目前为止所描述的方法之外,您还可以使用tidyverse方法。 以原始表列标签为例(但假设列未按所需方式舍入):

library(dplyr)
library(stargazer)

data_summary <- data_summary %>% 
    mutate(across('p'), round, 3)) %>%
    mutate(across('LMax'), round, 2)) %>%
    mutate(across(c('10%', '5%', '1%'), round, 1))
      
stargazer(df, summary = FALSE, digits = NA)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接