使用foreach和%dopar%输出所需的结果

时间:2015-09-21 11:55:29

标签: r

所以在一个简单化的世界中,让我们来看看这些数据:

set.seed(123)

require(doParallel)
cl<-makeCluster(2)
registerDoParallel(cl)

m <- 10

Result = foreach(i=1:m,.combine=cbind) %dopar% {

  rows <- (1:10)
  A <- rnorm(10, 5, 1)
  A <- round(A, 0)

  B <- rnorm(10, 6, 1)
  B <- round(B, 0)

  df <- data.frame(rows,A,B)

  output_1 <- length(df$A[df$A == df$B])
  # save the number of accounts where A == B
  output_2 <- length(df$A[df$A != df$B])
  # save the number of accounts where A  and B are not equal

  Result <- rbind(output_1,output_2)

}

使用此我们可以检查输出

Result[1,]
Result[2,]

但现在我想在结果的输出中包含与A!= B对应的行(一串行标识,而不是计数)

问题在于,这不是单个值,而且每次更改都会有所不同。怎么能实现这个目标呢?

更新

如果我们添加类似

的内容
output_3 <- setdiff(df$rows, df$rows[df$A == df$B])

并调整

Result <- rbind(output_1,output_2, output_3)

我们运行的模拟比需要的更多

1 个答案:

答案 0 :(得分:1)

这是你显然想要的:

set.seed(123)

require(doParallel)
cl<-makeCluster(2)
registerDoParallel(cl)

m <- 10

Result = foreach(i=seq_len(m)) %dopar% {

  rows <- (1:10)
  A <- rnorm(10, 5, 1)
  A <- round(A, 0)

  B <- rnorm(10, 6, 1)
  B <- round(B, 0)

  df <- data.frame(rows,A,B)

  output_1 <- length(df$A[df$A == df$B])
  # save the number of accounts where A == B
  output_2 <- length(df$A[df$A != df$B])
  # save the number of accounts where A  and B are not equal

  list(rbind(output_1, output_2), which(df$A != df$B))

}
stopCluster(cl)

返回列表列表。请注意,如果要将随机种子传递给工作者,则需要使用包doRNG。

这是我将使用的矢量化方法:

set.seed(42)
A <- matrix(round(rnorm(m * 10, 5, 1), 0), ncol = m)
B <- matrix(round(rnorm(m * 10, 6, 1), 0), ncol = m)

which(A != B, arr.ind = TRUE)
colSums(A != B)
colSums(A == B)