loop untuk membuat beberapa matriks di R (mungkin menggunakan tempel)

Saya ingin membuat 27 matriks dengan 2 kolom dan jumlah baris yang bervariasi. Saya hanya bisa menulis 27 baris kode, seperti ini:

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

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

....

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

Tapi pasti ada cara yang lebih baik untuk melakukan itu. Saya memikirkan sebuah lingkaran, kira-kira seperti ini:

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]))

Namun, itu tidak berhasil. Saya merasa ini adalah tugas yang sederhana, tetapi saya kehabisan ide.

Ada bantuan?

ps.: Saya memikirkan sebuah array, tetapi saya tidak dapat menggunakannya. Mungkin daftar bisa melakukan tugasnya, saya tidak tahu.


person Manoel Galdino    schedule 04.02.2011    source sumber
comment
Sepertinya penting bagi saya untuk membuat 27 objek R (x1, x2, x3,..., x27)   -  person Manoel Galdino    schedule 04.02.2011
comment
cari jawaban @Joshua Ulrich karena saya merasa mungkin salah memahami pertanyaan Anda. Jika Anda memerlukan matriks yang berbeda dan tidak digabungkan ke dalam daftar, maka tanda centang hijau harus diberikan padanya.   -  person daroczig    schedule 04.02.2011
comment
Kedua solusi tersebut akan berhasil. Terima kasih semuanya dan saya menandai jawaban (@daroczig) Anda karena itu berhasil untuk saya.   -  person Manoel Galdino    schedule 05.02.2011


Jawaban (4)


Anda membutuhkan assign:

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

Ini akan membuat 27 objek matriks di lingkungan global Anda.

person Joshua Ulrich    schedule 04.02.2011

Jika Anda memerlukan jumlah baris yang berbeda maka Anda pasti perlu menggunakan daftar. Lihat contoh di bawah ini:

Pertama, deklarasikan variabel aux Anda yang menampung jumlah baris yang akan dihasilkan:

aux <- 50:77

Dan biarkan lingkaran Anda berputar:

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

Yang akan mengembalikan daftar bingkai data Anda. Lihat mis. str(x) untuk daftar dan str(x[[1]]) untuk struktur matriks pertama. Yang terakhir akan kembali:

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

Dan Anda benar: proposal ini bisa ditulis jauh lebih bagus daripada proposal ini, carilah lapply dan sebagainya, tetapi yang lain akan membantu Anda mengatasi bagian rumit itu :)


Setelah mengedit: menambahkan lapply contoh

Coba kode di bawah ini jika Anda familiar dengan loop di atas (dan tentu saja cari ?lapply):

aux <- 50:77
fun <- function(x) cbind(rep(1,x), rnorm(x))
x <- lapply(aux, fun)
person daroczig    schedule 04.02.2011
comment
Tapi bukankah Anda harus membuat x terlebih dahulu? sesuatu seperti x ‹- list() atau x ‹- vector()? Saya komputer saya tidak menemukan objek x. - person Manoel Galdino; 04.02.2011
comment
Yap, kita perlu membuat x terlebih dahulu. Terima kasih banyak. Saya hanya menggunakan x ‹- list() - person Manoel Galdino; 04.02.2011
comment
@Manoel Galdino: ya, maaf atas kesalahan ini! Saya telah mengedit jawaban saya dan menambahkan baris tambahan, dan juga menambahkan contoh dengan lapply untuk membuat solusinya lebih rapi :) - person daroczig; 04.02.2011
comment
Alokasi awal! Tentukan x <- vector("list",27) sebelum loop, lalu atur setiap elemen x di dalam loop. Ini jauh lebih efisien daripada memperluas daftar untuk setiap iterasi. - person Joshua Ulrich; 04.02.2011
comment
@Joshua Ulrich: benar, terima kasih telah menunjukkan - itu sangat berguna. Saya telah mengedit jawaban saya untuk membuatnya lebih bagus. Dan saya baru saja (setelah membaca jawaban Anda) menyadari bahwa saya mungkin juga salah memahami pertanyaannya :( - person daroczig; 04.02.2011
comment

Saya tidak tahu apakah SQL server mendukung GUID sebagai tipe data, di MysQL saya akan menggunakan char, tapi itu tidak penting, hanya komentar. Bagian yang penting adalah dalam metode ini:

protected void Button1_Click(object sender, EventArgs e)
{
    con.Open();
    cmd = new SqlCommand("insert into Accom (UserID) values('" + @currentUserID + "')", con);
    cmd.ExecuteNonQuery();

}

Anda tidak menentukan nilai sebenarnya untuk @currentUserID, Anda harus menulis ulang menjadi seperti:

protected void Button1_Click(object sender, EventArgs e)
{
    SqlParameter param  = new SqlParameter();
    con.Open();
    cmd = new SqlCommand("insert into Accom (UserID) values(@currentUserID)", con);
    //this are the important lines that I'm talking about
    param.ParameterName = "@currentUserID";
    param.Value         = valueOfUserId;
    cmd.Parameters.Add(param);
    cmd.ExecuteNonQuery();    
}

Semoga itu bisa membantu.

- person Joshua Ulrich; 04.02.2011

Jika Anda tidak menentang daftar, inilah jawaban lain untuk pertanyaan Anda:

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 ...
person Roman Luštrik    schedule 04.02.2011

Kode di bawah ini menunjukkan bagaimana saya menggunakan pendekatan Joshua Ulrich untuk membuat matriks yang sedikit lebih kompleks. Semoga jawaban ini bermanfaat dan menunjukkan beberapa fleksibilitas dalam membuat objek. Jika tidak, saya dapat menghapus jawaban saya.

Saya menduga pendekatan ini dapat dimodifikasi dengan mudah untuk membuat matriks yang ukurannya berbeda, misalnya dengan menyetel nrow atau ncol sama dengan variabel dan menggunakan rep(q, z) dengan beberapa variabel z untuk menduplikasi elemen dalam vektor di dalam pernyataan matrix atau rbind:

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)
person Mark Miller    schedule 01.03.2018