2013-04-25 127 views
1

我试图通过意味着下一个代码,以削减层的数量增加多少列:[R通过函数

X <- matrix(c(6,7,9,9,9,17,19,4,12,2,3,6,7,7),ncol=2) 
layers <- c(5,10,15,20,25,30,35,40) 
partitions <- function(u) {cbind(pmin(layers[1],u),t(diff(pmin(layers,u))))} 
X <- cbind(X,lapply(X[,2], partitions)) 

该函数返回在各层分配一个整数。

A = A1 + A2 + ...... + A8

A <- 19 
partitions(A) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 5 5 5 4 0 0 0 0 

但结果没有我需要的矩阵。最终的矩阵将是7×(2(COLS从X)+ 8(以点层的NUM))

 [,1] [,2]  [,3] 
[1,] 6 Numeric,8 NULL 
[2,] 7 Numeric,8 NULL 
[3,] 9 Numeric,8 NULL 
[4,] 9 Numeric,8 NULL 
[5,] 9 Numeric,8 NULL 
[6,] 17 Numeric,8 NULL 
[7,] 19 Numeric,8 NULL 
> dim(X) 
[1] 7 3 

我尝试不同的形式和过尺寸的误差。

问候

+0

你介意加入'points' – Michele 2013-04-25 13:01:47

+0

的结构,并且定义了'layers',然后从来没有使用它。 (其实你*不定义层,因为你有一个双'< - ' - 一个错字或许?) – 2013-04-25 13:11:54

+0

@ SimonO101我看到了......可能'points'在那里...... :-) – Michele 2013-04-25 13:21:57

回答

1

其中这两个应该是你想要什么

> rbind(t(X),sapply(X[,2], partitions)) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 6 7 9 9 9 17 19 
[2,] 4 12 2 3 6 7 7 
[3,] 4 5 2 3 5 5 5 
[4,] 0 5 0 0 1 2 2 
[5,] 0 2 0 0 0 0 0 
[6,] 0 0 0 0 0 0 0 
[7,] 0 0 0 0 0 0 0 
[8,] 0 0 0 0 0 0 0 
[9,] 0 0 0 0 0 0 0 
[10,] 0 0 0 0 0 0 0 

> cbind(X,t(sapply(X[,2], partitions))) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 6 4 4 0 0 0 0 0 0  0 
[2,] 7 12 5 5 2 0 0 0 0  0 
[3,] 9 2 2 0 0 0 0 0 0  0 
[4,] 9 3 3 0 0 0 0 0 0  0 
[5,] 9 6 5 1 0 0 0 0 0  0 
[6,] 17 7 5 2 0 0 0 0 0  0 
[7,] 19 7 5 2 0 0 0 0 0  0 
+0

是的!其次是答案。非常感谢。 你对我的错误有解释吗?因为不明白我在想什么错误 – 2013-04-25 13:44:34

+0

+1好的解决方案。 – 2013-04-25 14:07:27

+0

@CaptainTyler他们,'lapply'和'sapply'非常相似,只是尝试输入'sapply'。它们有点不同,因为前者返回总是一个'list',后者试图简化'array'来自'lapply'的结果。希望我清楚... – Michele 2013-04-25 14:31:10