首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中快速实现两个嵌套的for循环

在R中快速实现两个嵌套的for循环
EN

Stack Overflow用户
提问于 2017-07-13 10:17:22
回答 2查看 1.5K关注 0票数 4

我需要取两个向量的任意两个元素之间的差别。如果是A<-c(1,2)B<-c(3,4),那么我的结果R应该是c(3-1,3-2,4-1,4-2)

用这个片段

代码语言:javascript
复制
myfunction <- function(N)
{
  A = runif(N)
  B = runif(N)
  R = c()
  for(a in A){
    for(b in B){
      R=c(b-a,R)
    }
  }
  R
}
print(system.time(result <- myfunction(300)))

我知道这一次

代码语言:javascript
复制
   user  system elapsed 
  14.27    0.01   14.39 

有什么更快的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2017-07-13 10:25:38

您可以使用expand.grid对方法进行矢量化:

代码语言:javascript
复制
A <- runif(300)
B <- runif(300)

library(dplyr)
R <- as.data.frame(expand.grid(A,B)) %>%
       mutate(Var3 = Var2-Var1)  

前5项产出如下:

代码语言:javascript
复制
      Var1     Var2          Var3
1 0.8516676 0.325261 -0.5264066246
2 0.2126453 0.325261  0.1126156694
3 0.5394620 0.325261 -0.2142010126
4 0.1364876 0.325261  0.1887734290
5 0.3248651 0.325261  0.0003958747 

这需要:

代码语言:javascript
复制
user  system elapsed 
0.02    0.00    0.02

你的职责是:

代码语言:javascript
复制
 user  system elapsed 
42.39    0.43   42.90    
票数 2
EN

Stack Overflow用户

发布于 2017-07-13 10:25:10

使用purrr::map2

代码语言:javascript
复制
library(tidyverse)

N = 300
A = runif(N)
B = runif(N)
R = c()

print(
  system.time(
    result <- map(
      .x = A,
      .f = ~ c(.x - B)) %>% unlist
  )
)

所需时间:

代码语言:javascript
复制
 user  system elapsed 
 0.02       0    0.02 

如果我现在引起了你的注意,请到这个回购那里去看看purrr

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45077747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档