【发布时间】: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 <- 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] <- vec[j]直接修改内存位置。先声明,再循环。 -
仅供参考:内存分配是
lapply和purrr:map比循环快的最大原因。因此,重新组织代码和预分配将大大提高速度,并使事情更容易阅读。 -
expand.grid(col2=vec, col1=vec, stringsAsFactors=FALSE)[2:1]
标签: r for-loop nested-loops