R

时间:2017-09-12 16:56:45

标签: r dataframe summary

我必须在 R 中创建摘要统计信息表。该表有4列。数据remittance==0remittance==1中存在变量,其中包括其他变量(将在表中的行中)的特征的均值和SD,如年龄,收入,城市,贫困等等。如何创建这样的表?我找不到任何合适的方法。这是我想要的那种表的一个例子:

Variable     remittance==0      remittance==1
             mean     sd        mean      sd
age           
female
married
income

3 个答案:

答案 0 :(得分:2)

要获得所需的格式,可以使用tidyr/dplyr。经过大量的改造,整理和重新整理......

summary_table = mtcars %>%
  group_by(vs) %>%
  summarize_all(funs(mean = mean, sd = sd)) %>%
  gather("stat", "val", -vs) %>%
  mutate(vs = paste0("vs", vs)) %>%
  unite(stat, stat, vs, sep = ".") %>%
  separate(stat, into = c("var", "stat"), sep = "_") %>%
  spread(stat, val) %>%
  select(var, mean.vs0, sd.vs0, mean.vs1, sd.vs1) %>%
  mutate_if(is.numeric, funs(round(., 3)))

结果tidyr/dplyr

# A tibble: 10 x 5
     var mean.vs0  sd.vs0 mean.vs1 sd.vs1
   <chr>    <dbl>   <dbl>    <dbl>  <dbl>
 1    am    0.333   0.485    0.500  0.519
 2  carb    3.611   1.539    1.786  1.051
 3   cyl    7.444   1.149    4.571  0.938
 4  disp  307.150 106.765  132.457 56.893
 5  drat    3.392   0.474    3.859  0.506
 6  gear    3.556   0.856    3.857  0.535
 7    hp  189.722  60.282   91.357 24.424
 8   mpg   16.617   3.861   24.557  5.379
 9  qsec   16.694   1.092   19.334  1.354
10    wt    3.689   0.904    2.611  0.715

您也可以使用stargazer,但我认为您无法将它们合并:

library(stargazer)
library(dplyr)

mtcars %>%
  split(mtcars$vs) %>%
  stargazer(type = "text", 
          summary.stat = c("mean", "sd"), 
          title = c("vs = 0", "vs = 1"))

结果stargazer

vs = 0
==========================
Statistic  Mean   St. Dev.
--------------------------
mpg       16.617   3.861  
cyl        7.444   1.149  
disp      307.150 106.765 
hp        189.722  60.282 
drat       3.392   0.474  
wt         3.689   0.904  
qsec      16.694   1.092  
vs         0.000   0.000  
am         0.333   0.485  
gear       3.556   0.856  
carb       3.611   1.539  
--------------------------

vs = 1
==========================
Statistic  Mean   St. Dev.
--------------------------
mpg       24.557   5.379  
cyl        4.571   0.938  
disp      132.457  56.893 
hp        91.357   24.424 
drat       3.859   0.506  
wt         2.611   0.715  
qsec      19.334   1.354  
vs         1.000   0.000  
am         0.500   0.519  
gear       3.857   0.535  
carb       1.786   1.051  
--------------------------

备注:

  1. tidyr/dplyr方法的优点是输出是一个数据框,因此您可以对其进行操作并将其用于进一步的计算。您无法使用stargazer
  2. 执行此操作
  3. stargazer方法的优点是它可以以漂亮的表格格式输出表格。即使在Latex。只需将type = "text"更改为type = "latex"即可。如果要在发布中或在rmarkdown文档的pdf输出中包含描述性统计信息,这将非常有用。
  4. 当然,您也可以结合使用这两种方法并利用这两种方法:

    结果为tidyr/dplyr + stargazer

    > stargazer(summary_table, type = "text", summary = FALSE)
    
    ========================================
       var  mean.vs0 sd.vs0  mean.vs1 sd.vs1
    ----------------------------------------
    1   am   0.333    0.485    0.5    0.519 
    2  carb  3.611    1.539   1.786   1.051 
    3  cyl   7.444    1.149   4.571   0.938 
    4  disp  307.15  106.765 132.457  56.893
    5  drat  3.392    0.474   3.859   0.506 
    6  gear  3.556    0.856   3.857   0.535 
    7   hp  189.722  60.282   91.357  24.424
    8  mpg   16.617   3.861   24.557  5.379 
    9  qsec  16.694   1.092   19.334  1.354 
    10  wt   3.689    0.904   2.611   0.715 
    ----------------------------------------
    
    > stargazer(summary_table, type = "latex", summary = FALSE, header = FALSE)
    

    enter image description here

答案 1 :(得分:2)

这在生物医学研究中通常被称为“表1”。有一个方便的R包,称为tableone,可以非常方便地为您提供。如果您发布reproducible example,我可以向您展示它如何处理您的数据。取而代之的是,基本代码将类似于:

library(tableone)
CreateTableOne(data=, vars=c("age","income"), factorVars=c("female","married"), 
               strata="remittance")

答案 2 :(得分:0)

data(iris)
library(psych)

describeBy(iris[,-5], iris[,5])

只需替换您的数据。