【问题标题】:Nested for loop permutation in R [duplicate]R中的嵌套for循环排列[重复]
【发布时间】:2021-02-27 19:12:06
【问题描述】:

我很难尝试使用嵌套循环来正确处理所有事情。我觉得我正在初始化不必要的变量。这段代码最终给了我想要的输出,但是可以做些什么来改进呢? rep(vec[i], length(vec)) 对我来说似乎很笨拙。

我也可以想象不同的方法来解决这个排列问题,使用复制或列表,但我在如何正确设置嵌套循环和在这种情况下需要帮助方面更加努力。

vec <- c("red", "blue", "green", "orange")

col2 <- vector()
final <- data.frame(col1 =NULL, col2 = NULL)

for (i in 1:length(vec)){
  for (j in 1:length(vec)){
    col1 <- rep(vec[i], length(vec))
    col2[j] <- vec[j]
    temp.df <- cbind(col1, col2)
  }
  final <- rbind(final, temp.df)
}

final

     col1   col2
1     red    red
2     red   blue
3     red  green
4     red orange
5    blue    red
6    blue   blue
7    blue  green
8    blue orange
9   green    red
10  green   blue
11  green  green
12  green orange
13 orange    red
14 orange   blue
15 orange  green
16 orange orange

【问题讨论】:

  • final &lt;- data.frame(col1=rep(vec, each=length(vec)), col2=vec)expand.grid(vec, vec)
  • 您的直觉是正确的,这是一种运行循环的缓慢方式。无论您分配的内存长度如何,分配内存都是一项缓慢的操作(cbind 和 rbind)(因此,如果可能,最好只分配一次)。使用rep 创建一个没有循环的col1 会快得多。那将删除一个循环。然后,将你的 col1 变成一个数据框,并声明一个充满 NA_character_ 的 col2(只分配一次内存)。然后使用df$col2[j] &lt;- vec[j]直接修改内存位置。先声明,再循环。
  • 仅供参考:内存分配是lapplypurrr:map 比循环快的最大原因。因此,重新组织代码和预分配将大大提高速度,并使事情更容易阅读。
  • expand.grid(col2=vec, col1=vec, stringsAsFactors=FALSE)[2:1]

标签: r for-loop nested-loops


【解决方案1】:

所以想要的最终结果是具有两种颜色的每种组合的 data.frame,对吗?

library(tidyverse)

tibble() %>% 
  expand(
    col1=c("red", "blue", "green", "orange"),
    col2=c("red", "blue", "green", "orange")
  )
# A tibble: 16 x 2
   col1   col2  
   <chr>  <chr> 
 1 blue   blue  
 2 blue   green 
 3 blue   orange
 4 blue   red   
 5 green  blue  
 6 green  green 
 7 green  orange
 8 green  red   
 9 orange blue  
10 orange green 
11 orange orange
12 orange red   
13 red    blue  
14 red    green 
15 red    orange
16 red    red   

作为一般经验法则,如果您要在 R 中使用循环,通常会有更好(即更有效和更简洁)的方法。

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多