Векторизация вложенного цикла for, который вводит все парные комбинации - PullRequest
0 голосов
/ 20 мая 2018

Я думал, что следующая проблема должна быть решена, или для ее выполнения должна существовать функция, но я не смог найти ответ.У меня есть вложенный цикл, который занимает строку от одного 3-х столбцов.фрейм данных и копирует его рядом с каждой из других строк, чтобы сформировать 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 голосов
/ 20 мая 2018

Наивное решение с использованием 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))
0 голосов
/ 20 мая 2018

Вы можете сделать:

ind <- seq_len(nrow(Sdat))
grid <- expand.grid(ind, ind)
compar <- cbind(Sdat[grid[, 1], ], Sdat[grid[, 2], ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...