R:将函数的结果放在子集之后的输入的相应原始位置

时间:2017-01-03 22:40:57

标签: r

假设我有两个矩阵matobj

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+列矩阵)将矩阵matobj转换为:

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

有什么想法吗?

1 个答案:

答案 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

对于更优雅的解决方案的任何建议将不胜感激!