如何将列表转换为具有重新排列的且分别命名的列的复杂表?

时间:2019-05-29 15:44:59

标签: r

我有一个包含30个数据框的列表(称为列表),所有数据框都有各自的名称(以公司命名),由回归输出组成。数据帧都看起来像这样:

term         estimate std.error statistic p.value
(Intercept)  0.0012   0.000     2.84      0.00
x$Return     0.8119   0.055     14.49     1.08
x$ReturnDum  0.2989   0.083     0.10      0.05

对于我的输出,我需要一个带有回归表的(pdf或png)文件,该文件包含上述所有输出。该表应如下所示:

Firm    (Intercept)  x$Return    x$ReturnDum
Firm1    0.0012       0.8119      0.2989
        (0.000)***   (0.055)     (0.083)**
Firm2    0.0242       0.2359      0.0239
        (0.000)***   (0.050)**   (0.909)
...

基本上,它应该包含四列(称为Firm,(拦截),x $ Return和x $ ReturnDum)和30行,每行一行。每行应包含公司名称(在Firm公司下),估计值和剩余每一列的std.error值(最好与显着性星一起使用-3个星表示p值<0.01,2个星表示p p值<0.05,并且1颗星表示p值<0.1,上面的所有值都没有星号。

我还没有弄清楚如何将我的列表转换成这种类型的表,希望对我有所帮助,因为我仍然是R的初学者!谢谢。

1 个答案:

答案 0 :(得分:2)

我们可以使用map中的purrrlistmutate的data.frame列“ std.error”循环到format到通过在"***"小于0.25时串联p.value来返回字符串,否则以character类型(case_when检查类型),select列感兴趣,转置(t,转换为data.frame,并根据list的名称创建id列“ Firm”(默认情况下,如果没有名称,则添加序列号) 。请注意,map返回list,而后缀_df将其转换为单个data.frame通过行绑定list元素而输出

library(tidyverse)
map_df(lst1, ~ 
          .x  %>%
          mutate(std.error = case_when(p.value < 0.05 ~
                   str_c("(", std.error, ")", "***"), 
                     TRUE ~ as.character(std.error)), 
                 estimate = round(estimate, 3)) %>%        
          select(estimate, std.error) %>%
          t %>%
           as.data.frame , .id = 'Firm')

对于多个类别,更简单的选择是cutfindInterval

map_df(lst1, ~ 
     .x %>%
       mutate(std.error = str_c("(", round(std.error, 3), ")", 
            c("****", "***", "**", "*")[findInterval(p.value, 
            c(0.01, 0.05, 0.1))+1]),
            estimate = round(estimate, 3)) %>%
       select(estimate, std.error) %>%
       t %>%
       as.data.frame %>% 
       rename_all(~ c("Intercept)",  "x$Return",    "x$ReturnDum")), .id = "Firm")