我是R的新手并且学习R的介绍。我有一个大矩阵(100000的倍数)和几百列。我在下面给出一个示例矩阵。
set.seed(1)
m4 <- matrix(sample(0:3,5*4, replace=TRUE),5,4) # sample event matrix
m4GROUP <- data.frame( X1=rowSums(m4[,1, drop=FALSE]), X2=rowSums(m4[,2:3]),
X3=rowSums(m4[,4, drop=FALSE]) ) # 1 column
m4GroupColID <- colSums(m4GROUP) # coln sum to generate a matrix per col
输出
m4
[,1] [,2] [,3] [,4]
[1,] 1 3 0 1
[2,] 1 3 0 2
[3,] 2 2 2 3
[4,] 3 2 1 1
[5,] 0 0 3 3
> m4GROUP # group by Col 1, Cols 2-3, Col4
X1 X2 X3
1 1 3 1
2 1 3 2
3 2 4 3
4 3 3 1
5 0 3 3
> m4GroupColID
X1 X2 X3
7 16 10
对不起,这是一个很长的帖子,我只是不知道如何缩短这一点而不会失去本质。
col 1的总事件ID为7,cols 2-3为16,col.4为10:
最终输出,例如在每列的cols 2-3中随机分配如下:cols的ID是:1-7,8-23,24-33。
Col 1 Col 2 Col 3 col 4
1 0 0 8 9 10 0 0 0 0 0 24 0 0
2 0 0 11 12 13 0 0 0 0 0 25 26 0
3 4 0 14 15 17 0 14 16 0 0 27 28 29
5 6 7 18 20 0 0 18 0 0 0 30 0 0
0 0 0 0 0 0 0 21 22 23 0 31 32 33
如果我们每行只有一个事件,则id生成和分发相当简单。
m1 <- matrix(sample(0:1,5*4, replace=TRUE),5,4) # sample event matrix
ifelse(m1==0, 0, matrix(sample(1:1,5*4, replace = T), 5,4)) # works for one ID assignment
我开始使用循环,知识,因为循环在R中不是更快。但是,无论是否有替换,我都会遇到错误。我肯定需要(在同一行上的Replacement = True)和行之间的(Replacement = False)。
nc <- max(m4GROUP$X1)
i <- 1
j <- 1
while(i <- 5){
if(m4[i,j] == 0){
m[i,j] <- matrix(0, 5, nc)
} else {
if(m4[i,j] == 1){
m[i,j] <- matrix(sample(1, i*nc, replace=T), 5, nc)
} else {
m[i,j] <- matrix(sample(2, i*nc, replace=T), 5, nc)
}
}
}
我知道这不对。我收到以下错误。
Error in m[i, j] <- matrix(sample(0, i * nc, replace = T), 5, nc) :
number of items to replace is not a multiple of replacement length
Error in m[i, j] <- matrix(0, 5, nc) :
number of items to replace is not a multiple of replacement length
我还尝试了以下方法:我没有得到满足上述要点的结果;此外,它们以每行的相同ID开头。我只得到3行而不是4行。最后,考虑到我的实际样本量,这并不理想。
size <- c(1:7, 1:16, 1:9, 10)
startID <- which(size==1)
endIDs <- c(which(size==1)[-1] -1, length(size))
mats <- mapply(function(x, y) t(size[seq(x, y)]), startID, endIDs)
library(plyr)
m <- (rbind.fill.matrix(mats))
输出:
m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
[1,] 1 2 3 4 5 6 7 NA NA NA NA NA NA NA NA NA
[2,] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
[3,] 1 2 3 4 5 6 7 8 9 10 NA NA NA NA NA NA
我再次为这篇长篇文章感到遗憾,但感谢您不仅要阅读本文,还要感谢帮助。