我是 multidplyr 的新手。我有一个类似于这创建的数据集:
library(multidplyr)
library(tidyverse)
library(nycflights13)
f<-flights %>% group_by(month) %>% nest()
现在我想在不同节点上对这些小标题中的每一个进行操作。
cluster <- create_cluster(12)
f2<-partition(f,month,cluster=cluster)
一切似乎都还好,直到这里,但是当我这样做时:
models<-f2 %>%
do(mod=lm(arr_delay~dey_delay,data=.))
我收到以下错误消息:
Error in checkForRemoteErrors(lapply(cl, recvResult)) :
12 nodes produced errors; first error: object 'arr_delay' not found
现在如果我尝试
f2 %>% browser(.)
然后尝试 .$ 我无权访问任何列-
任何想法如何访问这些列?
最佳答案
这个问题有两个部分:
1. 为什么使用 do
会出错?
将函数应用于嵌套列(或“列表列”)的“正确”方法不是使用 do
,而是使用 map
。在这种情况下,multidplyr
并不重要,因为正常的 dplyr
代码给出了相同的错误。
f <- flights %>% group_by(month) %>% nest()
models <- f %>%
do(mod = lm(arr_delay ~ dey_delay, data = .))
另一方面,使用
map
中的 purrr
效果很好。models <- f %>%
mutate(model = purrr::map(data, ~ lm(arr_delay ~ dep_delay, data = .)))
将 multidplyr
代码与 mutate
和 map
一起使用也可以正常工作。2. 如何查看
party_df
中的数据?你不能轻易做到这一点。请记住,它们在您当前的 R session 中不可用,但在节点上可用。您可以使用这个小实用函数访问名称:
names.party_df <- function(x) {
fun <- function(x) names(eval(x))
multidplyr::cluster_call(x$cluster, fun, as.name(x$name))[[1]]
}
但是要访问完整数据,您很可能需要再次对数据进行 collect
。或者,在 RStudio 中可以使用 View
,但请注意,这在大型数据集上效果不佳。关于r - listcolumns 和 multidplyr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40205391/