Построение всех комбинаций вектора - поиск лучшего пути - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть простой случай, который я мог бы решить безобразно, но я уверен, что должен существовать гораздо более умный (и более быстрый) способ.

Давайте возьмем этот вектор

d <- 1:6

Я хочу перечислить все возможные комбинации «в будущем»:

1 2
1 3
1 4
1 5
1 6
2 3
2 4
2 5
...
5 6

Первый способ, с помощью которого я мог бы прийти, следующий:

n <- 6
combDF <- data.frame()
for( i in 1:(n-1)){

  thisVal <- rep(i,n-i)
  nextVal <- cumsum(rep(1,n-1)) +  1
  nextVal <- nextVal[nextVal > i]
  print("---")
  print(thisVal)
  print(nextVal[nextVal > i])
 df <- data.frame(thisVal = thisVal, nextVal = nextVal)
 combDF <- rbind(combDF, df)
}

Я уверен, что должен быть более умный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Один подход с использованием expand.grid и поднабором:

d <- 1:6

foo <- expand.grid(a = d, b = d)
foo[foo[, "a"] > foo[, "b"], c("b", "a")]

Это может быть не лучшим способом решения проблем, если у вас большие векторы и ограничения памяти, так как вызов expand.grid генерирует много удаляемых элементов, но он вполне читабелен и четко сообщает намерение.

0 голосов
/ 02 ноября 2018

громкая отладка? Я просто нашел этот путь

as.data.frame(t(combn(d,m=2)))

  V1 V2
1   1  2
2   1  3
3   1  4
4   1  5
5   1  6
6   2  3
7   2  4
8   2  5
9   2  6
10  3  4
11  3  5
12  3  6
13  4  5
14  4  6
15  5  6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...