获得成对的样本,使得在任何组合(R)中不存在任何值的重复

  • 本文关键字:不存在 任何值 任何 样本 组合 r
  • 更新时间 :
  • 英文 :


我有一个看起来像这样的数据帧:

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

现在我想获得m对(x,y(的n样本,这样在任何组合和任何元素顺序中都不会重复任何值。

例如,对于m=2:样本[(1,3),(4,3)]不是有效解(在y中重复3个(,样本[(1,3),(4,1)]也不是有效解,(在第一个x和第二个y中重复1个(,但样本[(1,2),(3,4)][(1,1),(2,2)]是有效解的示例。

我一直在尝试这个,但我不知道如何找到和删除y中x的重复。

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))

这里有一个函数,它生成一个由m个元素的n个样本组成的列表,这些样本取自向量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

由reprex包(v0.3.0(创建于2020-04-16

您可能会从这样的开始

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(为TRUE(的值,例如 -which(res$x1NotOk | res$y1NotOk)

也许你可以试试下面的代码

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))

相关内容

最新更新