listcolumns和multidplyr

时间:2016-10-23 16:55:44

标签: r parallel-processing dplyr

我是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 个答案:

答案 0 :(得分:4)

这个问题分为两部分:

1。为什么使用do收到错误?

&#34;适当&#34;将函数应用于嵌套列(或&#34;列列&#34;)的方法不是使用do,而是使用map。在这种情况下,multidplyr并不重要,因为正常的dplyr代码会产生相同的错误。

f <- flights %>% group_by(month) %>% nest()    

models <- f %>% 
  do(mod = lm(arr_delay ~ dey_delay, data = .))
  

eval(expr,envir,enclos)中的错误:object&#39; arr_delay&#39;找不到

另一方面,使用map中的purrr可以正常工作。

models <- f %>%
  mutate(model = purrr::map(data, ~ lm(arr_delay ~ dep_delay, data = .)))

multidplyr代码与mutatemap一起使用也可以。

2。如何查看party_df

中的数据

你不能轻易做到这一点。请记住,它们在您当前的R会话中不可用,但在节点上不可用。您可以使用此小实用程序函数访问名称:

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,但请注意,这对大型数据集不起作用。