dplyr::do如何与data.table配合使用

3

dplyr::do不适用于data.table

# this works
data.frame(1) %>% 
  do(data.frame(1))
##   X1
## 1  1
# same for a data.table does not work
data.table(1) %>% 
  do(data.frame(1))
## Error in do_.data.table(.data, .dots = lazyeval::lazy_dots(...)) : 
##  argument ".f" is missing, with no default

一些调查发现了函数dodo_.data.table
do
## function (.data, ...) 
## {
## do_(.data, .dots = lazyeval::lazy_dots(...))
## }
## <environment: namespace:dplyr>
dplyr:::do_.data.table
## function (.data, .f, ...) 
## {
## list(.f(as.data.frame(.data), ...))
## }
## <environment: namespace:dplyr>

这是如何工作的?显然,do_.data.table的参数与从do获取的不兼容。而do_.data.table的结果是一个列表,而不是data.frame。我如何使用data.table输入来使用dodo_
我知道我可以使用df %>% data.frame %>% do(...),但我希望有一个直接的解决方案。

从你贴出的内容来看,.f 是在原始数据和你提供的参数上调用的函数(例如,它可以是 .f = data.framecbind),所以我会说你的帖子已经回答了“如何”的问题,而问题更多的是“为什么”它返回一个列表... 对此一无所知!你可以通过 ... %>% `[[`(1) 来获取列表中返回的数据框,但你可能已经知道了 :) - konvas
看起来像是一个 bug - 你能否在 dplyr 的 Github 页面上提供一个最小的 reprex? - hadley
@hadley:打开了[问题#1081](https://github.com/hadley/dplyr/issues/1081) - shadow
2个回答

1
看起来do_会使用你的参数执行.f并将其返回为列表。
data.table(1) %>%  
  do_(data.frame(2), data.frame(3), .f = function(x1, x2, x3) cbind(x1, x2, x3))

# [[1]]
#   V1 X2 X3
# 1  1  2  3

不过我不知道do


你可以简单地使用.f = cbind来避免指定参数数量。 - konvas

1
错误提示是说它不知道应该应用哪个函数,因为你没有为.f提供任何可用的东西。如果你输入一个函数,它就会工作:
data.table(1) %>% 
  do(function(x) data.frame(x))

返回
[[1]]
  V1
1  1

它在我的安装上不起作用(3.1.2,data.table_1.9.4 dplyr_0.4.1)。 - bergant
1
我之前使用的是dplyr 0.3.0.2版本,但在更新到当前版本后出现了错误。有趣的是它之前可以运行,现在却不行了。 - iacobus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接