我有一个看起来像这样的数据帧:
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))