在逻辑矩阵中有效地组合(与)一组列

时间:2019-01-02 22:52:16

标签: r matrix

我正在寻找一种有效的方法来组合逻辑矩阵中的选定列,方法是将它们“ AND”组合在一起并以新的矩阵结尾。我要寻找的示例:

matrixData <- rep(c(TRUE, TRUE, FALSE), 8)
exampleMatrix <- matrix(matrixData, nrow=6, ncol=4, byrow=TRUE)
exampleMatrix
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE  TRUE FALSE  TRUE
[2,]  TRUE FALSE  TRUE  TRUE
[3,] FALSE  TRUE  TRUE FALSE
[4,]  TRUE  TRUE FALSE  TRUE
[5,]  TRUE FALSE  TRUE  TRUE
[6,] FALSE  TRUE  TRUE FALSE

要相互进行“与”运算的列是在长度为ncol(exampleMatrix)的数字向量中指定的,其中要分组在一起进行“与”运算的列具有相同的值(从1到{{1 }},其中nn <= ncol(exampleMatrix)中的每个值至少使用一次)。结果矩阵应具有按1:n的顺序排列的列。例如,如果指定列组的向量是

1:n

那么结果矩阵将是

colGroups <- c(3, 2, 2, 1)

在结果矩阵中

      [,1]  [,2]  [,3]
[1,]  TRUE FALSE  TRUE
[2,]  TRUE FALSE  TRUE
[3,] FALSE  TRUE FALSE
[4,]  TRUE FALSE  TRUE
[5,]  TRUE FALSE  TRUE
[6,] FALSE  TRUE FALSE

我目前的做法基本上是这样的:

[,1] = exampleMatrix[,4] 
[,2] = exampleMatrix[,2] & exampleMatrix[,3]
[,3] = exampleMatrix[,1]

finalMatrix <- matrix(TRUE, nrow=nrow(exampleMatrix), ncol=3) for (i in 1:3){ selectedColumns <- exampleMatrix[,colGroups==i, drop=FALSE] finalMatrix[,i] <- rowSums(selectedColumns)==ncol(selectedColumns) } 是将矩阵中所有列与在一起的有效方法。

我的问题是我正在非常大的矩阵(数百万行)上执行此操作,并且我正在寻找任何方法来使此操作更快。我的第一个本能是以某种方式使用rowSums(selectedColumns)==ncol(selectedColumns),但是我看不到有任何方法可以使用它来提高效率,因为我没有多次在apply循环中执行操作,而是循环中的操作很慢。

此外,任何减少内存分配的技巧都将非常有用,因为我目前必须经常在循环内运行for以避免完全耗尽内存,而且这是一项非常昂贵的操作,会显着降低速度一切都下降了。谢谢!

对于一个更具代表性的示例,这是一个更大的gc()

exampleMatrix

2 个答案:

答案 0 :(得分:4)

从您的示例中,我了解到列数很少,行数也很多。在这种情况下,仅对Parameters: MyServicesLoadBalancer: Type: "String" Description: "ARN of the Load Balancer" Resources: MyServicesLoadBalancerListener: Type: "AWS::ElasticLoadBalancingV2::Listener" Properties: LoadBalancerArn: !Ref MyServicesLoadBalancer Port: 80 Protocol: HTTP DefaultActions: - Type: fixed-response FixedResponseConfig: ContentType: "text/plain" MessageBody: "You've reached the listener! Congrats!" StatusCode: "200" 做一个简单的循环会比较有效(比您的建议提高了30%):

colGroups

我认为如果没有并行化就很难克服这个问题。如果有更多的列,则此循环是可并行化的(尽管并行化必须谨慎一点(分批进行))。

答案 1 :(得分:2)

据我所知,这是使用all函数跨列的聚合。因此,如果将t放到行中,然后将colGroups用作应用all的分组因子,然后将t放回到列中,则应该得到预期的结果:< / p>

t(aggregate(t(exampleMatrix), list(colGroups), FUN=all)[-1])

#    [,1]  [,2]  [,3]
#V1  TRUE FALSE  TRUE
#V2  TRUE FALSE  TRUE
#V3 FALSE  TRUE FALSE
#V4  TRUE FALSE  TRUE
#V5  TRUE FALSE  TRUE
#V6 FALSE  TRUE FALSE

[-1]仅删除最终输出中不需要的组标识符变量。

如果您正在使用愚蠢的大数据,则也可以在data.table中进行按组汇总:

library(data.table)
t(as.data.table(t(exampleMatrix))[, lapply(.SD,all), by=colGroups][,-1])