【问题标题】:dplyr summarise data.table: refer to columns that you just createddplyr 汇总 data.table:引用您刚刚创建的列
【发布时间】:2014-10-07 12:20:52
【问题描述】:

引用刚刚在 dplyr 中创建的列适用于 tbl_dfs,但不适用于 data.tables。这是预期的吗?我在文档中没有看到这方面的说明。

这是可重现的示例:

library("hflights")
library("plyr")
library("dplyr")
library("data.table")

hflights_df <- tbl_df(hflights)

summarise(hflights_df,
      delay = mean(DepDelay, na.rm = TRUE),
      delay2 = 2*delay)
## Source: local data frame [1 x 2]
## 
##      delay  delay2
## 1 9.444951 18.8899

hflights_dt <- data.table(hflights_df)

summarise(hflights_dt,
      delay = mean(DepDelay, na.rm = TRUE),
      delay2 = 2*delay)
## Error in eval(expr, envir, enclos) : object 'delay' not found

这是我的会话信息:

sessionInfo()
## R version 3.0.2 (2013-09-25)
## Platform: x86_64-apple-darwin10.8.0 (64-bit)
## 
## locale:
## [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/C
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] data.table_1.9.2  dplyr_0.2         plyr_1.8.1        hflights_0.1     
## [5] andRstuff_1.0     devtools_1.5.0.99 tikzDevice_0.7.0  filehash_2.2-2   
## 
## loaded via a namespace (and not attached):
##  [1] assertthat_0.1 compiler_3.0.2 digest_0.6.4   evaluate_0.5.3 grid_3.0.2    
##  [6] httr_0.3       memoise_0.1    parallel_3.0.2 Rcpp_0.11.1    RCurl_1.95-4.1
## [11] reshape2_1.2.2 stringr_0.6.2  tools_3.0.2    whisker_0.3-2 

编辑: 这有效(类似于 jazzurro 和 KFB 的建议):

summarise(tbl_df(hflights_dt),
      delay = mean(DepDelay, na.rm = TRUE),
      delay2 = 2*delay)
## Source: local data frame [1 x 2]
## 
##      delay  delay2
## 1 9.444951 18.8899

但这不起作用:

summarise(tbl_dt(hflights_dt),
      delay = mean(DepDelay, na.rm = TRUE),
      delay2 = 2*delay)
## Error in eval(expr, envir, enclos) : object 'delay' not found

【问题讨论】:

  • hflights_dt &lt;- as.data.table(hflights_df) 为我工作,而不是 data.table(hflights_df)
  • @jazzurro 谢谢,但请参阅我对 KFB 回答的评论。我只认为这是一种解决方法。
  • @Arun 谢谢。这似乎是这里的问题。我不清楚为什么它在mutate 中有效,但在summarise 中无效。它是否记录在某处?
  • 关于文档,您必须询问 dplyr 开发人员。它与mutate 一起使用的原因是因为它们使用for 循环并通过引用分配,一次1 列。看看dplyr:::mutate_.grouped_dt

标签: r data.table dplyr


【解决方案1】:

改用 as.data.table:

> hflights_df <- tbl_df(hflights)
> hflights_dt <- as.data.table(hflights_df)
> summarise(hflights_dt,
+           delay = mean(DepDelay, na.rm = TRUE),
+           delay2 = 2*delay)
Source: local data frame [1 x 2]

     delay  delay2
1 9.444951 18.8899

【讨论】:

  • 有效,但只是一种解决方法。这显然是一个玩具示例。我真正的用例是调用data.table::fread()的结果
  • 请注意,这是因为class(hflights_dt)"tbl_df" "tbl" "data.table" "data.frame"。所以使用summarisetbl_df方法代替data.table方法。所以dplyr:::summarise.data.table 中的错误仍然存​​在。
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多