Получение образцов пар, чтобы не было повторения какого-либо значения ни в одной из комбинаций (R) - PullRequest
1 голос
/ 16 апреля 2020

У меня есть кадр данных, который выглядит следующим образом:

 X   Y
 1   1
 1   2
 1   3
 1   4
 2   1
 2   2
 2   3
 2   4
 3   1
 3   2
 3   3
 3   4
 4   1
 4   2
 4   3
 4   4

Теперь я хотел бы получить n выборок из m пар ( x, y ), так что нет повторения какого-либо значения ни в одной из комбинаций и ни в одном из порядков элементов.

Например, для m = 2: выборка [(1,3),(4,3)] не является допустимым решением (3 повторяется в y), образец [(1,3),(4,1)] также не является допустимым решением (1 повторяется в первом x и втором y), но образцы [(1,2),(3,4)] или [(1,1),(2,2)] являются примерами правильных решений.

У меня есть пытался это, но я не знаю, как найти и удалить дубликаты х в у.

y <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)
x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)

df <- data.frame(x, y)

subset(df[sample(nrow(df)),], !duplicated(x) & !duplicated(y))

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Возможно, вы могли бы начать с чего-то вроде этого

res <- cbind(df[sample(nrow(df)),], df[sample(nrow(df)),])

, а затем этого

res[,c("x1NotOk", "y1NotOk") ] <- t(apply(res, 1, function(x) x[1:2] %in% x[3:4]))

, который даст вам что-то вроде этого

  > res
   x y x.1 y.1 x1NotOk y1NotOk
4  1 4   2   3   FALSE   FALSE
10 3 2   1   2   FALSE    TRUE
5  2 1   4   3   FALSE   FALSE
2  1 2   2   1    TRUE    TRUE
16 4 4   1   1   FALSE   FALSE
.... 

После этого Вы отбрасываете те, где x1NotOk или y1NotOk (ИСТИНА), например, -which(res$x1NotOk | res$y1NotOk).

1 голос
/ 16 апреля 2020

Может быть, вы можете попробовать код, как показано ниже

m <- 2
n <- 5
res <- replicate(n,
                 Map(c,
                     x <- sample(unique(df$X),m),
                     y <- list(sample(setdiff(df$Y,x),m),x)[[sample(2,1)]]),
                 simplify = FALSE)

ДАННЫЕ

df <- rev(expand.grid(Y=1:4,X=1:4))
1 голос
/ 16 апреля 2020

Вот функция, которая генерирует список из n выборок из m элементов, взятых без повторов из векторов x и y:

unique_sets <- function(x, y, m, n) 
{
  lapply(seq(n),  function(z)
                  {
                    xs <- sample(x, m)
                    ys <- sample(unique(y[!(y %in% xs)]), m)
                    mapply(c, xs, ys, SIMPLIFY = FALSE)
                  })
}

Так что теперь вы можете сделать

y <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)
x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)

set.seed(69)
unique_sets(x, y, m = 2, n = 3)
#> [[1]]
#> [[1]][[1]]
#> [1] 4 2
#> 
#> [[1]][[2]]
#> [1] 1 3
#> 
#> 
#> [[2]]
#> [[2]][[1]]
#> [1] 4 1
#> 
#> [[2]][[2]]
#> [1] 2 3
#> 
#> 
#> [[3]]
#> [[3]][[1]]
#> [1] 4 3
#> 
#> [[3]][[2]]
#> [1] 2 1

Создано в 2020-04-16 пакетом Представления (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...