R foreach子选择很慢

时间:2015-04-13 16:40:48

标签: r foreach

我正在尝试针对目前堆叠在以下列中的多个数据集运行lm:

Counter Tag  Value
4       tag_1 8
3       tag_1 1
4       tag_2 4
3       tag_2 82
5       tag_2 5
4       tag_3 6
3       tag_3 2

我有另一张格式相同的表格。对于该表中的每个标记,我想运行一个lm并从中提取p值。因为每个标签中都有大量的标签,我想并行运行lm。尝试了以下内容:

# Setup Parallel Clusters
cl <- makeCluster(num_cpus, type="SOCK")
registerDoSNOW(cl)

p_mat_hold <- foreach(i:length(it), .combine=rbind) %dopar%
{

# Get values for tag i
sub_ind_df <- ind_df[which(ind_df$tag_name==ind_tags[i,1]),]

# Merge for modelling
df <- merge(sub_ind_df,sub_dep_df,by="counter")

# Fit lm & extract p-value
fit <- lm(median_value.y ~ median_value.x,data=df, na.action=na.omit)

# Extract p-value
fit_sum <- data.frame(coef(summary(fit)))
pv <- fit_sum[2,4]


}
stopCluster(cl)

注意:我想要并行执行的主要原因是因为一个表有~500个标签&amp;另一个~20000,意味着大约需要10000000 lm。

如果我在循环外逐个运行foreach循环的内容,它们运行正常(&amp; fast)。如果我将它们包装在for循环中,那么一切都很好,只有在foreach循环中才会停止运行。我在foreach&amp;中尝试了每一行。问题似乎是选择一个标签(特别是下面的哪个命令):

    sub_ind_df <- ind_df[which(ind_df$tag_name==ind_tags[i,1]),]

我应该注意,不会产生任何错误。问题是使用上面的命令,foreach循环运行非常慢,它本身在循环之外运行得非常快。

有什么建议吗?我已经尝试了各种选择全部无济于事的选择。其他一些尝试:

ind_tags[i,1] %in% ind_df$tag_name
sqldf(paste0("select * from ind_df where tag_name='",ind_tags[i,1],"'",drv="SQLite")

编辑:复制原始数据集的一些虚拟数据。

table_1 <- data.table(counter=c(1,2,3,1,2,3,4),
        tag_name=c('tag_1','tag_1','tag_1','tag_2','tag_2','tag_2','tag_2'),
        value=c(6,3,1,6,3,24,4))

table_2 <- data.table(counter=c(1,2,3,1,2,3,4),
          tag_name=c('tag_3','tag_3','tag_3','tag_4','tag_4','tag_4','tag_4'),
           value=c(5,6,23,1,6,3,1))

0 个答案:

没有答案