Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于R中的查找表聚合矩阵_R_Matrix_Aggregation_Lookup Tables - Fatal编程技术网

基于R中的查找表聚合矩阵

基于R中的查找表聚合矩阵,r,matrix,aggregation,lookup-tables,R,Matrix,Aggregation,Lookup Tables,我尝试使用R中另一个查找表(.csv)中存储的信息聚合一个大矩阵(.csv) 大型矩阵的示例: z1 z2 z3 z4 z5 z6 z7 z8 Z11 Z22 Z33 z4 0 0 0 0 0 0 0 0 0 Z511 Z62 Z711 Z80 0 0 0 0 0 0 0 我有一个查找表,告诉我哪些区域要聚合在一起,例如: old new z1 D1 z2 D1 z3 D1 z4 D4 z5 D4 z6 D6 z7 D7 z8 D7 这意味着我需要将z1,z

我尝试使用R中另一个查找表(.csv)中存储的信息聚合一个大矩阵(.csv)

大型矩阵的示例:
z1 z2 z3 z4 z5 z6 z7 z8
Z11
Z22
Z33
z4 0 0 0 0 0 0 0 0 0
Z511
Z62
Z711
Z80 0 0 0 0 0 0 0
我有一个查找表,告诉我哪些区域要聚合在一起,例如:

old  new
z1   D1
z2   D1
z3   D1
z4   D4
z5   D4
z6   D6
z7   D7
z8   D7
这意味着我需要将z1,z2,z3聚合成一个组。z4和z5进入另一组,依此类推

基于此查找表,我将创建一个新的矩阵,如下所示:

D1 D4 D6 D7
D1 18 12 6 12
D4 3 2 1 2
D6 6 4 2 4
D7 3 2 1 2
这是通过根据查找表将原始矩阵中的元素按如下所示的块求和来完成的:

z1z2z3z4z5z6z7z8
Z11
Z22
Z33
z4 0 0 0 0 0 0 0 0 0
Z511
Z62
Z711
Z80 0 0 0 0 0 0 0

我很想知道如何在R中有效地执行此操作。非常感谢。

我们可以使用
外部

un1 <- unique(df1$new)    
out <- outer(un1, un1, FUN = Vectorize(function(x, y)  
         sum(m1[df1$old[df1$new == x], df1$old[df1$new == y]])))
dimnames(out) <- list(un1, un1)
out
#   D1 D4 D6 D7
#D1 18 12  6 12
#D4  3  2  1  2
#D6  6  4  2  4
#D7  3  2  1  2

un1我们可以使用
outer

un1 <- unique(df1$new)    
out <- outer(un1, un1, FUN = Vectorize(function(x, y)  
         sum(m1[df1$old[df1$new == x], df1$old[df1$new == y]])))
dimnames(out) <- list(un1, un1)
out
#   D1 D4 D6 D7
#D1 18 12  6 12
#D4  3  2  1  2
#D6  6  4  2  4
#D7  3  2  1  2

感谢Martine Gal的编辑。谢谢你的评论,阿克伦。为了解决这个问题,我可以想到的一种方法是将查找列“new”添加到原始矩阵中,然后根据添加的列对行进行分组。然后,然后以类似的方式对列进行分组。但我想知道是否有更聪明的方法。谢谢Martine Gal的编辑。谢谢你的评论,阿克伦。为了解决这个问题,我可以想到的一种方法是将查找列“new”添加到原始矩阵中,然后根据添加的列对行进行分组。然后,然后以类似的方式对列进行分组。但我想知道是否有更聪明的方法,这太棒了!感谢您的快速解决方案。非常感谢。我的R技能还不足以完全理解代码,但我能够将您的解决方案应用到我的数据中。我发现结果有些问题。如果查找表是这样的,代码会工作吗?旧的:z1,z2,z3,z4,z5,z6,z7,z8,新的:D1,D2,D1,D4,D5,D1,D2,D4。也就是说,新ID对应于旧ID的非连续组?@njwork It。应该有。工作。因为。我们。是在网络上循环。唯一值,然后执行
==
。此处,I.假定为列。是
字符
类。对于旧的,新的,我真的很感激你的解决方案。然而,经过几轮检查,结果似乎仍然不正确。似乎每当新ID对应于一组连续的旧ID时,结果都是正确的。如果新ID对应于几个不连续的旧ID组,则结果不正确。在我的示例中,旧ID和新ID是字符,但在我的实际数据中,它们是数字(不确定这是否重要)。对不起!我在检查时犯了一个错误。您的代码工作得非常完美,结果绝对正确。再次为我的错误道歉。非常感谢你的帮助。这太棒了!感谢您的快速解决方案。非常感谢。我的R技能还不足以完全理解代码,但我能够将您的解决方案应用到我的数据中。我发现结果有些问题。如果查找表是这样的,代码会工作吗?旧的:z1,z2,z3,z4,z5,z6,z7,z8,新的:D1,D2,D1,D4,D5,D1,D2,D4。也就是说,新ID对应于旧ID的非连续组?@njwork It。应该有。工作。因为。我们。是在网络上循环。唯一值,然后执行
==
。此处,I.假定为列。是
字符
类。对于旧的,新的,我真的很感激你的解决方案。然而,经过几轮检查,结果似乎仍然不正确。似乎每当新ID对应于一组连续的旧ID时,结果都是正确的。如果新ID对应于几个不连续的旧ID组,则结果不正确。在我的示例中,旧ID和新ID是字符,但在我的实际数据中,它们是数字(不确定这是否重要)。对不起!我在检查时犯了一个错误。您的代码工作得非常完美,结果绝对正确。再次为我的错误道歉。非常感谢你的帮助。