嵌套for循环的矢量化,输入所有配对组合

时间:2018-05-20 14:27:40

标签: r vectorization nested-loops

我认为必须回答以下问题或者必须存在一个功能,但我无法找到答案。 我有一个嵌套的循环,从一个3-col中取一行。数据框并将其复制到每个其他行旁边,以形成6列。数据框(具有所有可能的组合)。这样可以正常工作,但是对于中等大小的数据集(800行),循环将永远完成任务。 我将演示一个示例数据集:

Sdat <- data.frame(
x = c(10,20,30,40),
y = c(15,25,35,45),
ID =c(1,2,3,4)
)

compar <- data.frame(matrix(nrow=0, ncol=6)) # to contain all combinations

names(compar) <- c("x","y", "ID", "x","y", "ID") 
N <- nrow(Sdat)     # how many different points we have

for (i in 1:N)
{
  for (j in 1:N)   
  {  
   Temp1 <-  Sdat[i,] # data from 1st point
   Temp2 <-  Sdat[j,]  # data from 2nd point
   C <- cbind(Temp1, Temp2)        
   compar <-   rbind(C,compar)
  }
}

这些循环提供了我进一步分析所需的输出。有关矢量化本节的任何建议吗?

2 个答案:

答案 0 :(得分:0)

你可以这样做:

ind <- seq_len(nrow(Sdat))
grid <- expand.grid(ind, ind)
compar <- cbind(Sdat[grid[, 1], ], Sdat[grid[, 2], ])

答案 1 :(得分:0)

使用rep的天真解决方案(假设您对数据帧输出感到满意):

compar <- data.frame(x = rep(Sdat$x, each = N),
                     y = rep(Sdat$y, each = N),
                     id = rep(1:n, each = N),
                     x1 = rep(Sdat$x, N),
                     y1 = rep(Sdat$y, N),
                     id_1 = rep(1:n, N))