【问题标题】:Convert summary to data.frame将摘要转换为 data.frame
【发布时间】:2015-05-29 02:53:45
【问题描述】:

我有这个admission_table 包含ADMITGREGPARANK

> head(admission_table)
  ADMIT GRE  GPA RANK
1     0 380 3.61    3
2     1 660 3.67    3
3     1 800 4.00    1
4     1 640 3.19    4
5     0 520 2.93    4
6     1 760 3.00    2

我正在尝试将此表的摘要转换为data.frame。我希望将ADMITGREGPARANK 作为我的列标题。

> summary(admission_table)
     ADMIT             GRE             GPA             RANK      
 Min.   :0.0000   Min.   :220.0   Min.   :2.260   Min.   :1.000  
 1st Qu.:0.0000   1st Qu.:520.0   1st Qu.:3.130   1st Qu.:2.000  
 Median :0.0000   Median :580.0   Median :3.395   Median :2.000  
 Mean   :0.3175   Mean   :587.7   Mean   :3.390   Mean   :2.485  
 3rd Qu.:1.0000   3rd Qu.:660.0   3rd Qu.:3.670   3rd Qu.:3.000  
 Max.   :1.0000   Max.   :800.0   Max.   :4.000   Max.   :4.000  

 > as.data.frame(summary(admission_table))
   Var1      Var2             Freq
1           ADMIT Min.   :0.0000  
2           ADMIT 1st Qu.:0.0000  
3           ADMIT Median :0.0000  
4           ADMIT Mean   :0.3175  
5           ADMIT 3rd Qu.:1.0000  
6           ADMIT Max.   :1.0000  
7             GRE  Min.   :220.0  
8             GRE  1st Qu.:520.0  
9             GRE  Median :580.0  
10            GRE  Mean   :587.7  
11            GRE  3rd Qu.:660.0  
12            GRE  Max.   :800.0  
13            GPA  Min.   :2.260  
14            GPA  1st Qu.:3.130  
15            GPA  Median :3.395  
16            GPA  Mean   :3.390  
17            GPA  3rd Qu.:3.670  
18            GPA  Max.   :4.000  
19           RANK  Min.   :1.000  
20           RANK  1st Qu.:2.000    
21           RANK  Median :2.000  
22           RANK  Mean   :2.485  
23           RANK  3rd Qu.:3.000  
24           RANK  Max.   :4.000  

当我尝试转换为 data.frame 时,这是我得到的唯一结果。我希望数据框有准确的输出,就像汇总表一样,因为之后我想使用这行代码将其插入 Oracle 数据库:

dbWriteTable(connection,name="SUM_ADMISSION_TABLE",value=as.data.frame(summary(admission_table)),row.names = FALSE, overwrite = TRUE ,append = FALSE)

有什么办法吗?

【问题讨论】:

  • 你真的想要那个精确的输出吗?使用Min. :0.0000 类型的结构?或者一列表示统计数据,一列表示值就足够了?
  • R现在如何实现OP结果?现在没有一个答案有效

标签: r dataframe


【解决方案1】:

你可以考虑unclass,我想:

data.frame(unclass(summary(mydf)), check.names = FALSE, stringsAsFactors = FALSE)
#              ADMIT             GRE             GPA            RANK
# 1 Min.   :0.0000   Min.   :380.0   Min.   :2.930   Min.   :1.000  
# 2 1st Qu.:0.2500   1st Qu.:550.0   1st Qu.:3.047   1st Qu.:2.250  
# 3 Median :1.0000   Median :650.0   Median :3.400   Median :3.000  
# 4 Mean   :0.6667   Mean   :626.7   Mean   :3.400   Mean   :2.833  
# 5 3rd Qu.:1.0000   3rd Qu.:735.0   3rd Qu.:3.655   3rd Qu.:3.750  
# 6 Max.   :1.0000   Max.   :800.0   Max.   :4.000   Max.   :4.000  
str(.Last.value)
# 'data.frame': 6 obs. of  4 variables:
#  $     ADMIT: chr  "Min.   :0.0000  " "1st Qu.:0.2500  " "Median :1.0000  " "Mean   :0.6667  " ...
#  $      GRE : chr  "Min.   :380.0  " "1st Qu.:550.0  " "Median :650.0  " "Mean   :626.7  " ...
#  $      GPA : chr  "Min.   :2.930  " "1st Qu.:3.047  " "Median :3.400  " "Mean   :3.400  " ...
#  $      RANK: chr  "Min.   :1.000  " "1st Qu.:2.250  " "Median :3.000  " "Mean   :2.833  " ...

请注意,在名称和值中都有很多多余的空格。

但是,执行以下操作可能就足够了:

do.call(cbind, lapply(mydf, summary))
#          ADMIT   GRE   GPA  RANK
# Min.    0.0000 380.0 2.930 1.000
# 1st Qu. 0.2500 550.0 3.048 2.250
# Median  1.0000 650.0 3.400 3.000
# Mean    0.6667 626.7 3.400 2.833
# 3rd Qu. 1.0000 735.0 3.655 3.750
# Max.    1.0000 800.0 4.000 4.000

【讨论】:

  • 来自broom packagetidy() 函数可用于将许多不同的摘要对象转换为data.frames。
  • 此答案中的第二个解决方案比第一个解决方案要好得多,因为第一个解决方案不解析行标签中的数字结果
  • @Steve'sConnect 据说这里不推荐使用tidy.table。令人难以置信的是没有可靠的方法来做到这一点
  • 如果有一些快速简单的东西会很棒,就像摘要(...)一样,带有舍入变量等。当然我们可以对其进行硬编码,但是...
【解决方案2】:

另一种输出数据帧的方法是:

as.data.frame(apply(mydf, 2, summary))

仅在选择数字列时有效。

如果存在带有 NA 的列,它可能会抛出 Error in dimnames(x)。在没有 as.data.frame() 函数的情况下首先检查一下是值得的。

【讨论】:

    【解决方案3】:

    这些解决方案都没有真正捕获汇总函数的输出。 tidy() 函数从摘要对象中提取元素并制作平淡无奇的 data.frame,因此它不保留其他功能或格式。

    如果您想要数据框中汇总函数的准确输出,您可以这样做:

    output<-capture.output(summary(thisModel), file=NULL,append=FALSE)
    output_df <-as.data.frame(output)
    

    这会保留所有新行,适合写入 XLSX 等,这将导致输出在各行之间适当间隔。

    如果您希望此输出折叠到单个单元格中,您可以这样做:

    output_collapsed <- paste0(output,sep="",collapse="\n")
    output_df <-as.data.frame(output_collapsed)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 2020-12-21
      • 2019-01-14
      • 2021-04-19
      • 2018-06-20
      • 2020-01-05
      相关资源
      最近更新 更多