我正在尝试建立一个完全由1和0组成的数据框。它应该是随机构建的,除了每个列需要累加一个指定值的事实。
如果这仅用于一个数据帧,我将知道如何执行此操作,但是需要将其内置到一个函数中,在该函数中将作为一个迭代过程完成,最大重复1000次。
最佳答案
一种有效的方法是将每列的适当数量的1和0改组为向量。您可以定义以下函数来生成一个矩阵,该矩阵具有指定的行数和每列中的1s数:
build.mat <- function(nrow, csums) {
sapply(csums, function(x) sample(rep(c(0, 1), c(nrow-x, x))))
}
set.seed(144)
build.mat(5, 0:5)
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0 0 0 0 1 1
# [2,] 0 0 0 1 0 1
# [3,] 0 0 0 0 1 1
# [4,] 0 1 1 1 1 1
# [5,] 0 0 1 1 1 1
要构建列表,可以对每个矩阵的所需列总和使用
lapply
:cslist <- list(1:3, c(4, 2))
set.seed(144)
lapply(cslist, build.mat, nrow=5)
# [[1]]
# [,1] [,2] [,3]
# [1,] 0 1 1
# [2,] 0 0 0
# [3,] 0 0 0
# [4,] 0 1 1
# [5,] 1 0 1
#
# [[2]]
# [,1] [,2]
# [1,] 0 0
# [2,] 1 0
# [3,] 1 1
# [4,] 1 0
# [5,] 1 1