我设置了两个问题,如下所示:
我有两个矩阵(Mat1和Mat2)。两个矩阵的大小相等。我有四个输出矩阵(分别为Output1,Output2,Output3,Output4),其大小与Mat1和Mat2相同。
问题1:
在Mat2中,标识包含列1中最大值的行。假设这是第1行。
转到Mat1的行1,提取Mat1 Row1的前3列,并将其存储在Output1中。将所有其他行存储在Mat2中的前3列中。在此阶段,Output1为1x3。输出2是(n-1)x3。
移至Mat2的第4列。标识包含最大值的行。可以说这是第5行。
转到Mat1列4的第5行。将Row5列4,5,6存储在Output1中。将Mat1的所有其他行存储在Output2中的第4,5,6列。 ...按照以下顺序对Mat2中的所有列重复此过程:1、4、7、9等。在这种情况下,我对于Mat1和Mat2有25列,因此该序列将以24结尾。
< / li>我需要能够将顺序从1,4,7,9等更改为1,13,25等。
问题2: 等于问题1,除了这次我确定每个阶段中包含前两个值的行。
在Mat2中,标识包含Column1中前两个值的行。假设这些行是2和5。将Mat1的行2和5的前3列存储在Output3中。将Mat1的所有剩余行(第1-3列)存储在Output4中。
移至Mat2的第4列。标识包含Mat2的第4列中前两个值的行。假设第1行和第2行。
移至Mat 1的第4列。将第4,5,6列的第1行和第2行存储到Output3中。将所有剩余的行存储在Output4中。
侧面说明:对于尺寸为1000x1000的矩阵,必须轻松扩展此过程。因此,最好不要手动执行此操作。
Mat1 <- data.frame(matrix(nrow = 10, ncol =25, data = rnorm(250,0,1)))
Mat2 <- data.frame(matrix(nrow = 10, ncol =25, data = rnorm(250,0,1)))
> Mat1
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13
1 -2.22415466 0.98712728 1.0084356 0.58447183 0.2608830 -0.341029099 -0.71693894 -0.61653058 -0.24790470 0.10777970 -1.68562271 -1.6638535 -0.5538468
2 1.11444365 -0.34865955 0.7518822 -0.07573724 0.1336811 -0.831275643 -0.15564822 -0.68849375 -0.05094047 0.21990082 -0.69879135 -0.6348292 1.0172304
3 -0.05367747 0.08654206 -0.3023270 -0.67335942 -1.1173279 0.004670625 0.52482501 0.78330982 1.18795853 -0.06513613 0.42353439 -0.4152209 1.7174158
4 0.42118984 -0.43257583 -1.3368036 1.64849798 0.8294276 1.256987496 -0.50440892 1.07686292 0.94196135 2.90916270 -0.08714083 0.1094395 1.1715895
5 -0.13720451 -0.94864452 1.9751962 -0.70523555 0.1431405 0.569928767 0.54877505 -0.44571903 -1.16282161 -1.65590032 -0.17710859 -0.8904316 0.3252576
6 0.64336424 -0.38277541 -1.6512377 -0.06542054 -0.1195322 0.666255832 0.60826054 1.88822842 -0.52952627 -0.44776682 0.04321836 -0.6190585 -0.9529690
7 -1.04160098 1.10952094 -0.9186759 0.77437293 -0.2284926 -0.113106151 -0.32092624 1.34157301 2.33813068 1.21812714 0.13165646 0.5532299 -1.3470645
8 1.22940987 -1.26271164 -1.2483658 -2.00578793 -0.6773794 -0.228135998 -0.06223206 -1.97606848 1.67339247 -0.47268196 -0.83544561 -0.3313278 -0.2373613
9 0.08485706 -1.60594589 0.8549923 -0.23394708 -0.5978692 -0.321839877 -0.55298452 -0.08387815 -0.99196489 0.83364114 -0.19579612 -0.8017648 -0.2238073
10 -1.71702699 0.39086484 -0.9974210 0.86232862 -0.2755329 -0.160656438 0.49669949 0.73763073 -0.42380390 1.91208332 -0.27778479 0.7866471 0.1813511
> Mat2
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13
1 0.11053732 -0.5750170 2.58105259 -1.6895285 0.0508918 -0.54188929 -0.92292169 1.4972970 0.009239807 -0.1706461 -0.8942262 -1.6351505 0.2029262
2 -0.83802776 -0.9322157 -0.34753884 0.8164819 0.7318198 0.09162218 0.15971493 -2.6731067 1.554323641 -0.3161967 0.4622101 -1.9521229 -1.3229961
3 0.61368153 -1.3650360 0.95674229 0.4582117 -0.6959545 -0.59627428 1.94172156 1.6784237 -0.482524695 -0.0514944 -0.4608930 -0.5456863 -0.1340540
4 -1.03156503 -0.2516495 0.76770177 -0.7841354 -3.2404904 -1.76276859 1.57421914 0.9782458 -1.364451438 -0.6437429 0.7485424 -0.8778284 1.7587504
5 0.01183232 0.6825633 1.39634308 1.4136879 0.5166420 0.76930390 0.67210932 1.3007904 -0.284451411 0.5163457 0.3198626 0.8030497 -1.4320064
6 -0.06110883 -0.6762991 0.56105196 0.9767543 -1.0016294 -0.84811626 -0.83319744 -1.1777865 -1.185631394 -0.5673733 0.2956725 0.5425602 -1.0510479
7 -0.56195630 1.3883881 0.09995573 0.6722959 -1.6205290 0.32085867 -0.94243554 -0.2340429 -1.299085265 -0.4433517 0.4424583 -2.8887970 0.1679859
8 1.04612102 0.8360530 0.07005306 0.4818317 1.1857504 0.13649605 1.35261983 0.8008935 -0.101922164 0.6773003 -1.0265770 0.1859912 0.2678461
9 0.88419676 -1.7012899 -1.09656000 -0.4360276 0.6238451 -2.03256276 -1.12575579 1.8407234 0.522372401 -0.6229582 0.6727720 -0.5695190 0.6298388
10 -0.68648649 -0.6689894 -0.56849261 -1.9012760 1.1418180 0.46377789 -0.08107475 1.4378120 -1.489367198 -0.7682887 -0.2858680 0.9584056 1.3178700
例如:
which.max(Mat2[,1]) # 8
因此转到Mat1
的第8行并将前3个列存储在Output1
中。
Output1[1, 1:3] # 1.22940987 -1.26271164 -1.2483658
将Mat1
的所有其他行存储在Output2
中的第1列至第3列。
which.max(Mat2[, 4]) # 5
暗含
Output1[1, 4:6] # -0.70523555 0.1431405 0.569928767
依此类推。
答案 0 :(得分:0)
这是您需要的吗?
Juggle <- function(m1, m2, col, step, top_n = 1) {
if (length(col) == 1) {
output_rows <- sort(m2[, col], index.return = TRUE, decreasing = TRUE)$ix
col_idx <- seq(col, col + step - 1)
top_idx <- seq(top_n)
bottom_idx <- seq(top_n + 1, nrow(m2))
max_out <- m1[output_rows[top_idx], col_idx]
rest_out <- m1[output_rows[bottom_idx], col_idx]
return(list(max_out = max_out, rest_out = rest_out))
} else {
left <- Juggle(m1, m2, col[1], step, top_n)
right <- Juggle(m1, m2, col[seq(2, length(col))], step, top_n)
return(list(
max_out = cbind(left$max_out, right$max_out),
rest_out = cbind(left$rest_out, right$max_out)
))
}
}
m1
和m2
是矩阵或数据帧。
col
是单个列或序列列,例如1、4、7、9或1,13,25。
step
是要提取的列数。
top_n
是要提取的行数。
这将返回一个列表,其中top_n行提取的内容为max_out,N-top_n行提取的内容为rest_out。