我有一个401 * 5677矩阵(比如G)和一个长度为5677的矢量(比如指数) 我需要获得一个完整的排名(按块)矩阵G.
矩阵G中的块由向量索引定义。例如,如果向量的前50个元素等于1,则表示矩阵的前50列属于组1等。
你知道我怎样才能获得逐块满秩矩阵?这意味着,G的401 * 50“子矩阵”必须是满秩,并且类似地,所有其余的“子矩阵”(每个对应于一个组)也必须是满秩。
我在那个问题上被困了太久了!我怎么能在R?
中做到这一点更具体地说,假设:
G=matrix(c(1,2,2,4,0,2,2,6,1,2,2,4,5,2,2,3,5,2,2,3),nrow=4)
index=c(1,1,2,2,2)
也就是说,G的前两列是group1,其余3列是第二列。 我想编写一个代码来执行以下操作:
在组1中查找依赖列,并使G的“子矩阵”对应于第一组,满级(例如,如果第1列和第2列依赖,则只保留其中一个)
在对应于第二组的G矩阵部分中执行相同操作。
因此,最后,最终矩阵在每个组内是满级(即,对应于组1的最终G的部分是满级,对应于组2的最终G的部分也是满级)
我还需要知道从G中删除了哪些列(如果有的话),以便从索引向量中删除相应的条目。
我正在使用的是为了找到在原始数据中使用的算法:
B=matrix(c(1,2,2,4,0,2,2,6,1,2,2,4,5,2,2,3,5,2,2,3),nrow=4)
s=c(1,1,2,2,2)
unique.s<-unique(s)
k=1
n=nrow(cB)
cB<-cor(B)
for(i in 1:length(unique.s)){
u=unique.s[i]
l=length(which(s==u))
for(r in 1:n){
for(c in k:k+l-1){
if(r<c && cB[r,c]==1){
B[,c]=NA
s[c]=NA
}
}
}
k=k+l
}
B.final<-B[,complete.cases(t(B))]
s.final<-s[complete.cases(s)]
我尝试根据相关矩阵找到依赖列(如果这是正确的,我现在不会)。因此,每次处理一组B矩阵时,我尝试(没有成功),根据它们是否具有等于1的相关性来移除B列。 例如,如果cB [1,2]为1,那么我想删除B [,2]列。该程序适用于B [,1:2],这是第1组的B部分和B [,3:5]的一部分,这是第2组的部分。
答案 0 :(得分:1)
仅修改为Vec[1:nrow(G)]
要确切地告诉您要求的内容有点难,但我相信您希望根据向量中的唯一值来对矩阵进行子集化,比如说Vec
,其中元素索引为{{1是Vec
的行索引。
如果您正在寻找,那么您可以迭代Vec中的唯一值
G
或者,您可以使用
lapply(unique(Vec), function(Ind) G[which(Vec[1:nrow(G)]==Ind), ]) # which is not needed if length(Vec) == nrow(G)