我正在寻找一种有效的方法来组合逻辑矩阵中的选定列,方法是将它们“ 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 }},其中n
和n <= 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
答案 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])