繁体   English   中英

具有来自另一个矩阵的id的子集矩阵

[英]subsetting matrix with id from another matrix

我想使用第二矩阵中的数据对一个矩阵的数据进行子集化。 标记一个矩阵的列。 例如,

area1 <- c(9836374,635440,23018,833696,936079,1472449,879042,220539,870581,217418,552303,269359,833696,936079,1472449,879042,220539,870581, 833696,936079,1472449,879042,220539,870581)
id <- c(1,2,5,30,31,34,1,2,5,1,2,5,1,2,5,30,31,34,51,52,55,81,82,85)
mat1 <- matrix(area1, ncol=3, byrow=T)
mat2 <- matrix(id, ncol=3, byrow=T)
dimnames(mat1) <-list(NULL, c("a1","a2","a3"))   

mat2包含mat1的id,所以矩阵的维数是相同的(即, mat1[1,1]标识mat2[1,1] 。我想要的是当值为c(1, 2, 5)的行)时创建mat1子矩阵在这个小例子中,子矩阵1将有2行数据,子矩阵2和3各有1行,子矩阵4将有来自mat1 4行数据。行数c(1, 2, 5)显示在mat2 。随后的1,3,5之间的行之间会有所不同。这有意义吗?

最初,矩阵是从数据帧转换而来的,其中id在一列中,而区域在第二列中。 我找不到在数据帧中在1行之间对变量行进行子集的方法,这就是我切换到矩阵的原因。

我认为这涵盖了它并符合您的描述:

spl <- cumsum(apply(mat2,1, function(x) all(x==c(1,2,5))))
split(as.data.frame(mat1),spl)

#$`1`
#       a1     a2      a3
#1 9836374 635440   23018
#2  833696 936079 1472449
# 
#$`2`
#      a1     a2     a3
#3 879042 220539 870581
#
#$`3`
#      a1     a2     a3
#4 217418 552303 269359
#
#$`4`
#      a1     a2      a3
#5 833696 936079 1472449
#6 879042 220539  870581
#7 833696 936079 1472449
#8 879042 220539  870581

结果符合“ 子矩阵1将有2行数据,子矩阵2和3每行有1行,子矩阵4将有来自mat1的4行数据

mat1[which(mat2[,1]==1 & mat2[,2]==2 & mat2[,3]==5),]
        [,1]   [,2]    [,3]
[1,] 9836374 635440   23018
[2,]  879042 220539  870581
[3,]  217418 552303  269359
[4,]  833696 936079 1472449
split(as.data.frame(mat1), apply(mat2, 1, paste, collapse = " "))
#$`1 2 5`
#       a1     a2      a3
#1 9836374 635440   23018
#3  879042 220539  870581
#4  217418 552303  269359
#5  833696 936079 1472449
#
#$`30 31 34`
#      a1     a2      a3
#2 833696 936079 1472449
#6 879042 220539  870581
#
#$`51 52 55`
#      a1     a2      a3
#7 833696 936079 1472449
#
#$`81 82 85`
#      a1     a2     a3
#8 879042 220539 870581

我想从你所说的,你想把它作为一个数据框架。 您可以通过抓取具有特定列值的行来轻松创建子矩阵。

在这里,我将数据框放回到一起并制作了一个仅用于1的子矩阵。您可以通过在多个“area1”列上使用cbind来轻松添加它。

> area1 <- c(9836374,635440,23018,833696,936079,1472449,879042,220539,870581,217418,552303,269359,833696,936079,1472449,879042,220539,870581, 833696,936079,1472449,879042,220539,870581)
> id <- c(1,2,5,30,31,34,1,2,5,1,2,5,1,2,5,30,31,34,51,52,55,81,82,85)
> original<-as.data.frame(cbind(id,area1))
> original[original$id==1,]
   id   area1
1   1 9836374
7   1  879042
10  1  217418
13  1  833696

然后你可以像我这样做我之前说过的话。

> col1<-original[original$id==1,"area1"]
> col2<-original[original$id==2,"area1"]
> col3<-original[original$id==5,"area1"]
> submat<-cbind(col1,col2,col3)
> colnames(submat)<-c("a1","a2","a3")
> submat
          a1     a2      a3
[1,] 9836374 635440   23018
[2,]  879042 220539  870581
[3,]  217418 552303  269359
[4,]  833696 936079 1472449

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM