提取行并计算平均值

时间:2019-09-12 08:34:29

标签: r matrix

我设置了两个问题,如下所示:

我有两个矩阵(Mat1和Mat2)。两个矩阵的大小相等。我有四个输出矩阵(分别为Output1,Output2,Output3,Output4),其大小与Mat1和Mat2相同。

问题1:

  1. 在Mat2中,标识包含列1中最大值的行。假设这是第1行。

  2. 转到Mat1的行1,提取Mat1 Row1的前3列,并将其存储在Output1中。将所有其他行存储在Mat2中的前3列中。在此阶段,Output1为1x3。输出2是(n-1)x3。

  3. 移至Mat2的第4列。标识包含最大值的行。可以说这是第5行。

  4. 转到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,除了这次我确定每个阶段中包含前两个值的行。

  1. 在Mat2中,标识包含Column1中前两个值的行。假设这些行是2和5。将Mat1的行2和5的前3列存储在Output3中。将Mat1的所有剩余行(第1-3列)存储在Output4中。

  2. 移至Mat2的第4列。标识包含Mat2的第4列中前两个值的行。假设第1行和第2行。

  3. 移至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

依此类推。

1 个答案:

答案 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)
    ))
  }
}

m1m2是矩阵或数据帧。
col是单个列或序列列,例如1、4、7、9或1,13,25。
step是要提取的列数。
top_n是要提取的行数。

这将返回一个列表,其中top_n行提取的内容为max_out,N-top_n行提取的内容为rest_out。