【问题标题】:Data Frame, wrong summary数据框,错误总结
【发布时间】:2014-04-22 23:25:21
【问题描述】:

我有一个非常大的数据框,称为 FTSE。这是他的结构。

str(FTSE)

'data.frame':   21167 obs. of  5 variables:
 $ Name         : Factor w/ 2 levels "FTSE MIB","FTSE MIB NET TOT ": 1 1 1 1 1 1 1 1 1 1 ...
 $ DateLastTrade: Factor w/ 18 levels "12/10/13","12/11/13",..: 9 9 9 9 9 9 9 9 9 9 ...
 $ LastPrice    : num  19091 19008 19002 19018 19018 ...
 $ Open         : num  19091 19091 19091 19091 19091 ...
 $ LastClose    : num  19021 19021 19021 19021 19021 ...

我试着总结了一下,得到了:

summary(FTSE)
                Name        DateLastTrade     LastPrice          Open         LastClose    
 FTSE MIB         :10289   12/3/13 : 1370   Min.   :17750   Min.   :17811   Min.   :17805  
 FTSE MIB NET TOT :10878   12/4/13 : 1370   1st Qu.:18124   1st Qu.:18055   1st Qu.:18124  
                           12/6/13 : 1370   Median :18321   Median :18310   Median :18313  
                           12/2/13 : 1369   Mean   :18366   Mean   :18375   Mean   :18352  
                           12/5/13 : 1369   3rd Qu.:18595   3rd Qu.:18752   3rd Qu.:18697  
                           12/23/13: 1353   Max.   :19091   Max.   :19091   Max.   :19021  
                           (Other) :12966      

注意“最后价格”列。 如果我尝试直接总结 LastPrice (我在分析中实际需要的变量),我得到了这个,这与以前有很大的不同。

summary(FTSE$LastPrice)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  17750   18120   18320   18370   18600   19090 

我是 R 的新手,我真的不明白为什么值不同。是四舍五入的问题?我已经阅读了很多关于此的答案,但我找不到统一结果的解决方案。 我真的被这个问题困住了。

感谢任何可以帮助我甚至试图理解我的问题的人。 问候

为 shujaa 编辑:

max(FTSE$LastPrice) 
[1] 19091.3

FTSE[which.max(FTSE$LastPrice), ]
      Name DateLastTrade LastPrice    Open LastClose
1 FTSE MIB       12/2/13   19091.3 19091.3  19021.48

【问题讨论】:

  • LastPrice 列中是否存在缺失值 (NA)?
  • @RichardScriven 我可以看到使分位数不同,也许,但最大不同!
  • 请发几行数据,dput(head(data))。你在这里使用quantmod吗?
  • 我很好奇的几件事:1. 你能用数据子集复制这个吗?如果您只使用 10000 行、15000 行等会怎样。 2. 如果 LastPrice 始终是整数(看起来是这样),请尝试使用 as.integer() 对其进行转换,看看是否有任何变化。
  • 我也很好奇哪个是对的。 max(FTSE$LastPrice)FTSE[which.max(FTSE$LastPrice), ] 得到什么?

标签: r dataframe summary


【解决方案1】:

这是一个四舍五入的问题。 summary(FTSE$LastPrice) 的所有输出只有 4 个有效数字。如果您查看 ?summary 在其 Usage 部分中,您会看到数字的默认值(作为命名参数)加上数字的默认值作为选项,您可以得到 4。

 # summary(object, ..., digits = max(3, getOption("digits")-3))

> getOption("digits")
[1] 7

那就试试吧:

summary(FTSE$LastPrice, digits=7)

然而,一个悬而未决的问题仍然存在:为什么 summary.data.frame 函数不进行相同程度的舍入,因为对于数字的默认参数对于 .default.data.frame 方法是相同的?查看代码,您会看到 summary.data.frame 实际上首先在其列上使用固定值 digits=12L 执行 summary.default,然后使用数字参数到 format。在我看来,帮助页面在参数描述中的这个区域有些晦涩

digits: integer, used for number formatting with signif() (for summary.default) or 
                                                 format() (for  summary.data.frame).

它完全忽略了 data.frame 列的默认(和固定)signif 完全不同的事实。

【讨论】:

    【解决方案2】:

    data.frame 上的摘要 methodvector 的默认方法不同。可能导致使用不同的计算精度。 Read more here。如果您明确指定数字,它会起作用:

    让我们创建数据:

    nr <- 21167
    set.seed(nr)
    temp <- data.frame(Name=sample(c("FTSE","FTSE NET"),nr,replace=T),
                       DateLastTrade=sample(1:18,nr,replace=T),
                       LastPrice = sample(18000:21000,nr,replace=T),
                       Open = 19091,
                       LastClose = 19021
                       )
    
    
    str(temp)
    

    现在让我们重现你得到的:

    summary(temp)
    summary(temp$LastPrice)
    

    现在让我们解决这个问题:

    summary(temp,digits=7)
    summary(temp$LastPrice,digits=7)
    

    注意:这仅适用于您的数字 digit=10

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多