按R中的类别平均值除以矩阵值

按R中的类别平均值除以矩阵值,r,matrix,categories,transformation,R,Matrix,Categories,Transformation,我有一个矩阵a,每个时间段包含211行和6列,另一个矩阵B包含211行和2列,第二个矩阵包含分类信息1-9 我的目标是创建一个新的矩阵C,其中矩阵a中的每个值是值a除以值a的平均值除以类别B。我使用聚合函数计算了每列中每个类别的平均值。这些数据存储在单独的数据帧中,列_表示,每个时间波存储在单独的列中。这还包含列_means[,1]中关于组的信息 我不知道如何从这里开始,我正在寻找一个优雅的解决方案,这样我就可以将这些知识转移到未来的项目中,并可能改进我现有的代码。我的猜测是,这个解决方案隐藏在

我有一个矩阵a,每个时间段包含211行和6列,另一个矩阵B包含211行和2列,第二个矩阵包含分类信息1-9

我的目标是创建一个新的矩阵C,其中矩阵a中的每个值是值a除以值a的平均值除以类别B。我使用聚合函数计算了每列中每个类别的平均值。这些数据存储在单独的数据帧中,列_表示,每个时间波存储在单独的列中。这还包含列_means[,1]中关于组的信息

我不知道如何从这里开始,我正在寻找一个优雅的解决方案,这样我就可以将这些知识转移到未来的项目中,并可能改进我现有的代码。我的猜测是,这个解决方案隐藏在dplyr中的某个地方,一旦你知道它,它就相当简单了

谢谢你的建议

数据示例:

##each column here represents a wave:
initialmatrix <- structure(c(0.882647671948723, 0.847932241438909, 0.753052308699317, 
0.754977233408875, NA, 0.886095543329695, 0.849625252682829, 
0.78893884364632, 0.77111113840682, NA, 0.887255207679895, 0.851503493865384, 
0.812107856411831, 0.793982699495818, NA, 0.885212452552841, 
0.854894065774315, 0.815265718290737, 0.806766276556325, NA, 
0.882027335190646, 0.85386634818439, 0.818052477777012, 0.815997781565393, 
NA, 0.88245957310107, 0.855819521951304, 0.830425687228663, 0.820857689847061, 
NA), .Dim = 5:6, .Dimnames = list(NULL, c("V1", "V2", "V3", "V4", 
"V5", "V6")))

##the first column is unique ID, the 2nd the category:
categories <- structure(c(1L, 2L, 3L, 4L, 5L, 2L, 1L, 2L, 2L, 4L), .Dim = c(5L, 
2L), .Dimnames = list(NULL, c("V1", "V2")))

##the first column represents the category, column 1-6 the mean per category for each corresponding wave in "initialmatrix"
column.means <- structure(list(Group.1 = 1:5, x = c(0.805689153058216, 0.815006230419524, 
0.832326976776262, 0.794835253329865, 0.773041961434791), asset_means_2...2. = c(0.80050960343197, 
0.81923553710203, 0.833814773618545, 0.797834687980729, 0.780028077018158
), asset_means_3...2. = c(0.805053341257357, 0.828691564900149, 
0.833953165695685, 0.799381078569563, 0.785813047374534), asset_means_4...2. = c(0.806116664276125, 
0.832439754757116, 0.835982197159582, 0.801702200401293, 0.788814840753852
), asset_means_5...2. = c(0.807668548993891, 0.83801834926905, 
0.836036508152776, 0.803433961863399, 0.79014026195926), asset_means_6...2. = c(0.808800359101212, 
0.840923947682599, 0.839660313992458, 0.804901773257962, 0.793165113115977
)), row.names = c(NA, 5L), class = "data.frame")

这看起来像是超人的工作。。。不,等等。。。地图2


这就是你想做的吗

options(digits=3)
divisor <- column.means[categories[, 2], -1]
divisor
#         x asset_means_2...2. asset_means_3...2. asset_means_4...2. asset_means_5...2. asset_means_6...2.
# 2   0.815              0.819              0.829              0.832              0.838              0.841
# 1   0.806              0.801              0.805              0.806              0.808              0.809
# 2.1 0.815              0.819              0.829              0.832              0.838              0.841
# 2.2 0.815              0.819              0.829              0.832              0.838              0.841
# 4   0.795              0.798              0.799              0.802              0.803              0.805
initialmatrix/divisor
#         x asset_means_2...2. asset_means_3...2. asset_means_4...2. asset_means_5...2. asset_means_6...2.
# 2   1.083              1.082              1.071              1.063              1.053              1.049
# 1   1.052              1.061              1.058              1.061              1.057              1.058
# 2.1 0.924              0.963              0.980              0.979              0.976              0.988
# 2.2 0.926              0.941              0.958              0.969              0.974              0.976
# 4      NA                 NA                 NA                 NA                 NA                 NA

你能添加一个最小的示例数据、你尝试过的代码等来让你的问题重现吗?当然,马库斯-对不起,我认为问题很简单,但事后看来,重现的示例总是更明智的选择。正如我所说,我对如何继续感到困惑-我几乎找不到开始解决问题的方法,因此我不得不让您失望,因为我迄今为止尝试的代码,尽管我仍在进行研究。您是否有理由使用矩阵而不是数据帧?看起来,如果你从一个7列的数据帧开始,它可以很容易地用dplyr解决。我对使用df和dplyr的解决方案持开放态度,Lamia-当然!我会马上把它们转换回来。我使用矩阵的原因是,我使用RSiena的库需要矩阵格式来读取协变量。如果我理解正确,您有3个类别:1、2和4。例如,对于具有3行的类别2,您希望如何规范化by中第1列第1行中的值0.8826477?换句话说,你的预期产出是多少?谢谢你,rjen。不幸的是,我得到了以下错误:```错误:变异输入有问题..2。x映射向量的长度必须一致:*。x的长度为211*。y的长度为422ℹ 输入..2跨越。。。。很明显,422是211的两倍,所以我猜它乘以了类别*第2列的数量?还感谢您建议使用map2函数。方便的东西,我正在读。@SteffenT:不客气。当我使用示例数据时,我的解决方案始终适用于我。1我的解决方案是否适用于您端的示例数据?2如果是的话,我想我们应该查找您提供的数据和示例数据之间的差异。它确实适用于示例,因此确实存在差异。卡森的回答对我来说很有用,所以我就到此为止,但当我面临更多类似的问题时,我会读入map2。再次感谢!谢谢你-这工作完美无瑕。我现在就用这个解决方案。
options(digits=3)
divisor <- column.means[categories[, 2], -1]
divisor
#         x asset_means_2...2. asset_means_3...2. asset_means_4...2. asset_means_5...2. asset_means_6...2.
# 2   0.815              0.819              0.829              0.832              0.838              0.841
# 1   0.806              0.801              0.805              0.806              0.808              0.809
# 2.1 0.815              0.819              0.829              0.832              0.838              0.841
# 2.2 0.815              0.819              0.829              0.832              0.838              0.841
# 4   0.795              0.798              0.799              0.802              0.803              0.805
initialmatrix/divisor
#         x asset_means_2...2. asset_means_3...2. asset_means_4...2. asset_means_5...2. asset_means_6...2.
# 2   1.083              1.082              1.071              1.063              1.053              1.049
# 1   1.052              1.061              1.058              1.061              1.057              1.058
# 2.1 0.924              0.963              0.980              0.979              0.976              0.988
# 2.2 0.926              0.941              0.958              0.969              0.974              0.976
# 4      NA                 NA                 NA                 NA                 NA                 NA