我有一些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)
你可以用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)