2011-02-04 62 views
2

我想創建2列27行和可變行數的矩陣。 我可以只寫27行代碼,就像這樣:循環在R中創建幾個矩陣(可能使用粘貼)

x1 = cbind(rep(1,34), rnorm(34)) 

x2 = cbind(rep(1,36), rnorm(36)) 

....

x27 = cbind(rep(1,k), rnorm(k)) 

但它必須有一個更好的方式來做到這一點。我想到了一個循環,像這樣:

aux = c(34, 36, ..., k) # auxiliar variable with number of rows for each matrix 

for (i in 1:27) paste("x",i, sep="") = cbind(rep(1,aux[i]), rnorm(aux[i])) 

但是,它不起作用。我覺得這是一個簡單的任務,但我沒有想法。

任何幫助?

ps .:我想到了一個數組,但我無法使用它。也許列表可以完成這項工作,我不知道。

+0

它SEMMNS是對我很重要,以創造27個[R對象(X1,X2,X3,...,X27) – 2011-02-04 00:10:45

+0

找@Joshua Ulrich的答案,因爲我覺得我可能會誤解你的問題。如果你需要不同的矩陣,而不是連接到一個列表,比綠色的複選標記應該給他。 – daroczig 2011-02-04 00:34:56

回答

6

您需要assign

for (i in 1:27) { 
    assign(paste("x",i,sep=""), cbind(rep(1,aux[i]), rnorm(aux[i]))) 
} 

這將在您的全球環境中創建27個矩陣對象。

3

如果您需要不同數量的行,那麼您肯定需要使用列表。看下面的例子:

首先,聲明你aux變量持有的行數生成:

aux <- 50:77 

而且讓你的環旋:

x <- vector("list",27) 
for (i in 1:27) { 
    x[[i]] <- cbind(rep(1,aux[i]), rnorm(aux[i])) 
} 

哪位能給回來就行的數據幀。見例如第一矩陣的結構爲str(x),第二矩陣的結構爲str(x[[1]])。後者將返回:

num [1:50, 1:2] 1 1 1 1 1 1 1 1 1 1 ... 

而且你是正確的:它可能比這個提議被寫入要好很多,找lapply等,但其他人會幫助你與棘手的部分:)


編輯完成後:添加lapply例如

嘗試下面如果你熟悉上面的循環代碼(當然找?lapply):

aux <- 50:77 
fun <- function(x) cbind(rep(1,x), rnorm(x)) 
x <- lapply(aux, fun) 
2

如果你對名單沒有,這裏的另一射擊在你的問題:

aux <- 30:40 
manoel <- sapply(aux, function(x) { 
      matrix(NA, ncol = 2, nrow = x) 
     }, simplify = FALSE) 

> str(manoel) 
List of 11 
$ : logi [1:30, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:31, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:32, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:33, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:34, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:35, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:36, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:37, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:38, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:39, 1:2] NA NA NA NA NA NA ... 
$ : logi [1:40, 1:2] NA NA NA NA NA NA ... 
1

下面的代碼顯示瞭如何用約書亞Ulrich的方式,創造稍微複雜的矩陣。希望這個答案很有幫助,它顯示了創建對象時可能具有的一些靈活性。如果沒有,我可以刪除我的答案。

我懷疑這種方法可以很容易地被修改以創建在大小不同,例如矩陣,通過設定nrowncol等於一個變量,並使用rep(q, z)與一些變量z複製的matrixrbind內部在矢量元素聲明:

p1.c1 <- 0.10 
p2.c1 <- 0.20 
p3.c1 <- 0.30 
p4.c1 <- 0.40 

s1.c1 <- matrix(c(p1.c1, p1.c1, (1 - p1.c1), 
        p1.c1, p1.c1, (1 - p1.c1), 
         0,  0,   1), nrow=3, ncol=3, byrow = TRUE) 
s2.c1 <- matrix(c(p2.c1, p2.c1, (1 - p2.c1), 
        p2.c1, p2.c1, (1 - p2.c1), 
         0,  0,   1), nrow=3, ncol=3, byrow = TRUE) 
s3.c1 <- matrix(c(p3.c1, p3.c1, (1 - p3.c1), 
        p3.c1, p3.c1, (1 - p3.c1), 
         0,  0,   1), nrow=3, ncol=3, byrow = TRUE) 
s4.c1 <- matrix(c(p4.c1, p4.c1, (1 - p4.c1), 
        p4.c1, p4.c1, (1 - p4.c1), 
         0,  0,   1), nrow=3, ncol=3, byrow = TRUE) 

n <- 5 

p.c1 <- c(p1.c1, p2.c1, p3.c1, p4.c1) 

for (i in 1: (n - 1)) { 
    assign(paste('xs', i, '.c1', sep=""), matrix(c(p.c1[i], p.c1[i], (1-p.c1[i]), 
               p.c1[i], p.c1[i], (1-p.c1[i]), 
                 0,  0,   1), nrow=3, ncol=3, byrow = TRUE)) 
} 
identical(xs1.c1, s1.c1) 
identical(xs2.c1, s2.c1) 
identical(xs3.c1, s3.c1) 
identical(xs4.c1, s4.c1) 

for (i in 1: (n - 1)) { 
    assign(paste('ys', i, '.c1', sep=""), rbind(c(p.c1[i], p.c1[i], (1-p.c1[i])), 
               c(p.c1[i], p.c1[i], (1-p.c1[i])), 
                c(0,  0,   1))) 

} 
identical(ys1.c1, s1.c1) 
identical(ys2.c1, s2.c1) 
identical(ys3.c1, s3.c1) 
identical(ys4.c1, s4.c1)