首页 > 解决方案 > R中的嵌套for循环排列

问题描述

我很难尝试使用嵌套循环来正确处理所有事情。我觉得我正在初始化不必要的变量。这段代码最终给了我想要的输出,但是可以做些什么来改进呢?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

标签: rfor-loopnested-loops

解决方案


因此,所需的最终结果是具有两种颜色的每种组合的 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 中使用循环,通常会有更好的(即更有效和更简洁)的方法。


推荐阅读