我有两个矩阵:
tab
val1 210 201 2001 2020
val2 302 200 2919 3030
val3 839 939 8383 8383
tab2
val1 2.3 3.4
val2 3.4 8.3
val3 7.3 8.3
现在我首先要从tab2中取val1并将其与tab的第1列值匹配,如果匹配,则将val1(tab2)与val1(tab)的相应值相乘。如何实现这个逻辑,任何建议? tab和tab2中的第1列实际上是字符值,而不是行名。 编辑。
1. Take row one first data (val1) and match it with the first column of table one i.e tab. for example, if we are matching val1, then val1 is present in the 1st column 1st row of tab, and it matches.
2. If a match is found then take values of val1 row from tab2 i.e. 2.3 and 3.4 and multiply them with the values of matched row in table 1 i.e tab. meaning multiply first 2.3 to all values i.e. 2.3*210, 2.3*201, 2.3*2001, 2.3*2020. Then take other value and do the same i.e. 3.4*210, 3.4*201, 3.4*2001, 3.4*2020.
3. The result would be two different matrices resulting from each multiplication.
答案 0 :(得分:0)
使用rownames将数据重新排列到矩阵中会使这更方便,因为行名称不是列,因此不会强制数字数据的字符模式。以下是矩阵的外观。我为此示例创建了无意义的列名,以便显示结果中的产品使用哪些列。
> tab
a b c d
val1 210 201 2001 2020
val2 302 200 2919 3030
val3 839 939 8383 8383
> tab2
e f
val1 2.3 3.4
val2 3.4 8.3
val3 7.3 8.3
首先,遍历行名称与sapply
的交集。这将每行名称运行一次迭代。在这里他们都匹配,但这不是必要的。它们也必须处于相同的顺序,但行名称必须是唯一的。
然后,要创建每一行,您可以使用outer
函数。 sapply
会返回您想要的转置,因此使用t
将其转置回来。如果需要,可以将列名应用于此结果。
result <- t(sapply(intersect(rownames(tab), rownames(tab2)),
function(x) outer(as.matrix(tab[x, ]), as.matrix(tab2[x, ])))
)
result
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## val1 483.0 462.3 4602.3 4646.0 714.0 683.4 6803.4 6868.0
## val2 1026.8 680.0 9924.6 10302.0 2506.6 1660.0 24227.7 25149.0
## val3 6124.7 6854.7 61195.9 61195.9 6963.7 7793.7 69578.9 69578.9
要根据原始列的列名分配列名,请再次对名称使用outer
,这次转到paste
。这确保了与用于数值计算的名称计算使用相同的顺序。
colnames(result) <- outer(colnames(tab), colnames(tab2), FUN=paste, sep='*')
result
## a*e b*e c*e d*e a*f b*f c*f d*f
## val1 483.0 462.3 4602.3 4646.0 714.0 683.4 6803.4 6868.0
## val2 1026.8 680.0 9924.6 10302.0 2506.6 1660.0 24227.7 25149.0
## val3 6124.7 6854.7 61195.9 61195.9 6963.7 7793.7 69578.9 69578.9
这显示输入中的哪些列在输出中创建列。