在矩阵中采样列值,无需替换

tbk*_*ent 4 r

我有一些R的经验,但总是很难编写新的代码.我在处理当前项目时发现了一些非常有用的帖子,但似乎无法找到下一步.这是我到目前为止所做的:

  • 进口了20x20 .csv的排名; 每列包含1到20的每个整数的一个实例,因此所有colSums都是210. rowSums不同.

  • 在这里使用一个帖子从原始矩阵中随机抽取4行并将它们放入一个新的4x20矩阵中.

现在,我需要从每行中抽取5列,而不需要替换列. 也就是说,我只需要每列使用一次,每行有五个值.(我没有偏好这是否给我一个矩阵,在正确的位置有20个值和60个零,或者如果我得到4个5值的向量.我想我有点想要矩阵吗?)

如果上下文有帮助,我正在尝试根据课堂中的主题排名创建组.行是主题,列是选民(学生).最终我想在for循环中创建这些随机分配,并多次运行程序以希望自动优化选择(通过一些测量;显然有不同的优化方法),而不是通过盯着原始矩阵,这是什么我过去做过.

这是我的4x20矩阵:

    J  E  I  S  A  N  H  T  M  B  D  K  O  G  P  L  Q  R  F  C
2   5  4  1  1  5 13  3  4 13 11 14 14 20  9 15  9 11 17  9 15
13 20 19 17 19 19  7  4 19  7  1  5  1 17 15 10  6  7 14  6  3
14 18  2 12 14 11 19 18 15 19  4  8 19  2  2 13  7  9  1 12 10
18  4  7 18  5 12 18  2 20  6  7 16 15  5 18  1 13  2 18 14 16
Run Code Online (Sandbox Code Playgroud)

这是我想要的(一个版本):

    J  E  I  S  A  N  H  T  M  B  D  K  O  G  P  L  Q  R  F  C
2   0  4  1  1  0  0  3  4  0  0  0  0  0  0  0  0  0  0  0  0
13  0  0  0  0  0  7  0  0  0  1  5  1  0  0  0  0  0  0  0  3
14  0  0  0  0 11  0  0  0  0  0  0  0  0  2  0  7  0  1 12  0
18  4  0  0  0  0  0  0  0  6  0  0  0  5  0  1  0  2  0  0  0
Run Code Online (Sandbox Code Playgroud)

Sve*_*ein 7

你可以用apply.以下命令将从每行中随机抽取五个值并返回结果的矩阵:

apply(mat, 1, sample, 5)
Run Code Online (Sandbox Code Playgroud)

您可能希望转置返回的矩阵t以匹配原始矩阵.


如果只想使用每一列,可以使用以下命令:

mat[cbind(seq(nrow(mat)), sample(ncol(mat), 5 * nrow(mat)))]
Run Code Online (Sandbox Code Playgroud)

它将返回包含值的向量.

要匹配所需的输出格式(矩阵包括零和随机选择的值),您可以使用以下策略:

# create an index of the values to be kept
idx <- cbind(seq(nrow(mat)), sample(ncol(mat), 5 * nrow(mat)))

# create a new matrix of zeroes
mat2 <- matrix(0, ncol = ncol(mat), nrow = nrow(mat))

# copy the values from the original matrix to the new one
mat2[idx] <- mat[idx]
Run Code Online (Sandbox Code Playgroud)