在 R 中的循环中创建一个向量

Create a vector within a Loop in R

我有以下代码:

    generator <- function(n){
  nodes <- c()
  distances <- c()
  for (main in 1:n){
    for (i in 1:n) {
      for (j in 1:n){
        if (main != i & i != j & main != j & i < j){
          nodes <- c(nodes, paste(main, i, j, sep=",", collapse=""))
          distances <- c(distances, main+i+j)}}}}
  data <- data.frame(nodes, distances)
  return(data)}

运行 generator(4),我得到以下输出:

      nodes distances
1  1,2,3         6
2  1,2,4         7
3  1,3,4         8
4  2,1,3         6
5  2,1,4         7
6  2,3,4         9
7  3,1,2         6
8  3,1,4         8
9  3,2,4         9
10 4,1,2         7
11 4,1,3         8
12 4,2,3         9

我想要的是 "nodes" 列中的项目是值的实际向量,目的是比较不同的节点三元组并找到共同成员。它目前只是一个字符串。因此,例如,我希望 a$nodes[1][1] 产生 1 或类似的东西,这样我就可以从 nodes 三元组中提取每个单独的值。

我目前有 paste(main, i, j, sep=","),我尝试用 c(main, i, j) 替换它,但结果是我得到了一个 36 行而不是 12 行的数据框:每个单独的节点都是它自己的行。

谢谢。

您需要使用列表列来完成您想做的事情。

我建议使用 tibbles 而不是常规数据框,它们对于此类工作要方便得多。

如果您更愿意坚持使用基数 R,您可以将 data <- tibble::tibble(nodes, distances) 替换为:

data <- data.frame(distances)
data$nodes <- nodes  

新功能

generator <- function(n){
  nodes <- list()      # changed this from `c()` to `list()`
  distances <- c()
  for (main in 1:n){
    for (i in 1:n) {
      for (j in 1:n){
        if (main != i & i != j & main != j & i < j){
          nodes <- append(nodes, list(c(main, i, j))) # changed this to append a list instead of a vector
          distances <- c(distances, main+i+j)}}}}
  data <- tibble::tibble(nodes, distances) # changed `data.frame` to `tibble`
  return(data)}

输出

df <- generator(4)

df
# A tibble: 12 x 2
#        nodes distances
#      <list>     <int>
#  1 <int [3]>         6
#  2 <int [3]>         7
#  3 <int [3]>         8
#  4 <int [3]>         6
#  5 <int [3]>         7
#  6 <int [3]>         9
#  7 <int [3]>         6
#  8 <int [3]>         8
#  9 <int [3]>         9
# 10 <int [3]>         7
# 11 <int [3]>         8
# 12 <int [3]>         9

df$nodes[[1]]
# [1] 1 2 3

旁注

您正在增加一个列表,这可能会很慢,如果您 运行 遇到性能问题,请尝试用 nodes <- vector("list", length = max_length) 定义 nodes 并在最后定义 trim nodes <- nodes[lengths(nodes)!=0].