假设我有两个矩阵mat
和obj
:
time <- c(1, 1, 2, 2, 3, 3)
money <- c(2, 2, 4, 4, 6, 6)
ownership <- c(1, 0, 1, 0, 1, 0)
randomstuff <- matrix(runif(18),nrow = 3)
mat <- rbind(time, money, ownership, randomstuff)
dat <- c(1, 0, 2, 0, 3, 0)
obj <- matrix(dat,nrow=1)
我正在通过一个函数运行它们:
f <- function(mat,obj){fake function outputting a vector the same length as obj}
soln <- f(mat, obj).
其中soln
是1x6矩阵。
我怎样才能(优雅地 - 这实际上是一个70000+列矩阵)将矩阵mat
和obj
转换为:
time <- c(1, 2, 3)
money <- c(2, 4, 6)
ownership <- c(1, 1, 1)
mat <- rbind(time, money, ownership, randomstuff)
dat <- list(1, 2, 3)
obj <- matrix(dat,nrow=1)
soln
为1x3矩阵。
soln= [,1] [,2] [,3]
[1,] 4.151969 5.759826 5.537563
从mat
排除列的决定取决于ownership[]=0
中的值和obj
的相同值。增加的难点是,我需要能够将soln
中的输出分配给映射到较大SOLN
矩阵中的相应原始位置。在这种情况下,列1,3,5。所有权是随机分配的,因此除上述零之外不会有任何模式。
建议使用:
obj2 <- obj[, as.logical(ownership), drop = FALSE]
mat2 <- mat[, as.logical(ownership)]
完美适用于那件作品。如何将soln
值放在较大SOLN
矩阵的1,3,5位置?下面的SOLN
矩阵是可能输出的示例。在这种情况下,我希望第1,第3和第5列由此函数填充。后续操作(相同操作不同ownership
)将填充第2,4和6列。
SOLN = [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 4.151969 1.08251 5.759826 3.368613 5.537563 3.471643
有什么想法吗?
答案 0 :(得分:0)
我有一个部分答案。我可以找到列索引:
soln2 <- c(7,8,9)
index <- which(ownership==1, arr.ind=TRUE)
> index
[1] 1 3 5
现在,我知道我需要创建一个结果空间:
SOLN <- matrix(data=NA,nrow=1,ncol=6)
> SOLN
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA NA NA NA NA NA
> SOLN[,1]<-soln2[1]
> SOLN[,3]<-soln2[2]
> SOLN[,5]<-soln2[3]
> SOLN
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 7 NA 8 NA 9 NA
我需要一种超过70,000次的方法。我应该使用APPLY
函数,但我不知道它是什么。我确实有一个for循环解决方案。
> for (i in 1:length(index)){
+ j=index[[i]]
+ print(j)
+ SOLN[,j]=soln2[i]
+ }
[1] 1
[1] 3
[1] 5
> SOLN
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 7 NA 8 NA 9 NA
对于更优雅的解决方案的任何建议将不胜感激!