使用Officer包将“列表”对象添加到Word文档

时间:2019-07-31 01:30:52

标签: r statistics officer

第一次在这里发布。

我正在尝试获取一些统计结果,以使用Officer包将其输出到Word文档中。我了解到body_add_ *函数似乎仅适用于数据帧。但是,功能和测试(例如gvlma和ncvTest)作为具有非常规尺寸的列表输出,因此在使用data.frame()将它们转换为数据帧之前,我无法使用tidyr包整理列表。因此,我需要帮助将列表中的这些文本块添加到Word文档中。

到目前为止,作为ADF测试,这是一个很好的列表,可以轻松转换为数据帧:

# ADF test into dataframe
adf_df = data.frame(adf)
adf_df
ft <- flextable(data = adf_df) %>%
  theme_booktabs() %>%
  autofit()

# Output table into Word doc
doc <- read_docx() %>%
  body_add_flextable(value = ft) %>%
  body_add_par(gvlma)
fileout <- "test.docx"
print(doc, target = fileout)

body_add_par(gvlma)行显示错误:

Warning messages:
1: In if (grepl("<|>", x)) { :
  the condition has length > 1 and only the first element will be used
2: In charToRaw(enc2utf8(x)) :
  argument should be a character vector of length 1
all but the first element will be ignored

gvlma输出为列表,这是输出:

Call:
lm(formula = PD ~ ., data = dataset)

Coefficients:
  (Intercept)  WorldBank_Oil  
        1.282         -1.449  


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = model) 

                    Value p-value                Decision
Global Stat        4.6172  0.3289 Assumptions acceptable.
Skewness           0.1858  0.6664 Assumptions acceptable.
Kurtosis           0.1812  0.6703 Assumptions acceptable.
Link Function      1.7823  0.1819 Assumptions acceptable.
Heteroscedasticity 2.4678  0.1162 Assumptions acceptable.

1 个答案:

答案 0 :(得分:0)

使用iris数据集复制错误:

library(officer); library(flextable)

adf_df <- iris

ft <- flextable(data = adf_df) %>%
  theme_booktabs() %>%
  autofit()

gvlma <- lm(Petal.Length ~ Sepal.Length + Sepal.Width, data=iris)

# Output table into Word doc
doc <- read_docx() %>%
  body_add_flextable(value = ft) %>%
  body_add_par(gvlma)
  

警告消息:1:如果if(grepl(“ <​​|>”,x)){:   长度> 1,仅使用第一个元素2:   charToRaw(enc2utf8(x)):参数应为的字符向量   长度1,除第一个元素以外的所有元素都会被忽略

这里的问题是线性模型被保存为列表,可以有效地调用测试参数或模型统计信息。不能作为静态输出。

解决此问题的一种方法是使用library(broom)中的命令

library(broom)
gvlma2 <- tidy(gvlma)
gvlma3 <- glance(gvlma)

doc <- read_docx() %>%
  body_add_flextable(value = ft) %>%
  body_add_flextable(value = flextable(gvlma2)) %>%
  body_add_flextable(value = flextable(gvlma3))


fileout <- "test.docx"
print(doc, target = fileout)

gvlma2:

# A tibble: 3 x 5
  term         estimate std.error statistic  p.value
  <chr>           <dbl>     <dbl>     <dbl>    <dbl>
1 (Intercept)     -2.52    0.563      -4.48 1.48e- 5
2 Sepal.Length     1.78    0.0644     27.6  5.85e-60
3 Sepal.Width     -1.34    0.122     -10.9  9.43e-21

gvlma3:

   r.squared adj.r.squared sigma statistic  p.value    df logLik   AIC   BIC deviance df.residual
       <dbl>         <dbl> <dbl>     <dbl>    <dbl> <int>  <dbl> <dbl> <dbl>    <dbl>       <int>
 1     0.868         0.866 0.646      482. 2.74e-65     3  -146.  300.  312.     61.4         147