Misalkan saya memiliki matriks dengan 2 dan fungsi yang mengambil 2-vektor sebagai salah satu argumennya. Saya ingin menerapkan fungsi ke setiap baris matriks dan mendapatkan vektor-n. Bagaimana melakukan ini di R?
Misalnya, saya ingin menghitung kepadatan distribusi Normal standar 2D pada tiga titik:
bivariate.density(x = c(0, 0), mu = c(0, 0), sigma = c(1, 1), rho = 0){
exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+x[2]^2/sigma[2]^2-2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
}
out <- rbind(c(1, 2), c(3, 4), c(5, 6))
Bagaimana cara menerapkan fungsi ke setiap baris out
?
Bagaimana cara melewatkan nilai untuk argumen lain selain poin ke fungsi dengan cara yang Anda tentukan?
apply()
- ini menyapu demi baris (jika argumen kedua adalah 1, selain itu dengan kolom), dan baris saat ini (atau kolom) selalu merupakan argumen pertama. Begitulah cara hal-hal didefinisikan.MARGIN
argumennya. Di sini artinya menerapkan fungsi ke baris (dimensi pertama dalamdim(M)
). Jika jumlahnya 2, itu akan menerapkan fungsi ke kolom.Jika Anda ingin menerapkan fungsi umum seperti sum atau mean, Anda harus menggunakan
rowSums
ataurowMeans
karena lebih cepat daripadaapply(data, 1, sum)
pendekatan. Jika tidak, tetaplah denganapply(data, 1, fun)
. Anda bisa meneruskan argumen tambahan setelah argumen FUN (seperti yang sudah disarankan Dirk):Kemudian Anda dapat melakukan sesuatu seperti ini:
sumber
Berikut adalah contoh singkat penerapan fungsi ke setiap baris matriks. (Di sini, fungsi yang diterapkan menormalkan setiap baris ke 1.)
Catatan: Hasil dari
apply()
harus dialihkan menggunakant()
untuk mendapatkan tata letak yang sama dengan matriks masukanA
.Hasil:
sumber
Langkah pertama adalah membuat objek fungsi, lalu menerapkannya. Jika Anda menginginkan objek matriks yang memiliki jumlah baris yang sama, Anda dapat menentukannya sebelumnya dan menggunakan bentuk objek [] seperti yang diilustrasikan (jika tidak, nilai yang dikembalikan akan disederhanakan menjadi vektor):
Jika Anda ingin menggunakan selain parameter default Anda, panggilan harus menyertakan argumen bernama setelah fungsi:
apply () juga bisa digunakan pada larik berdimensi lebih tinggi dan argumen MARGIN bisa berupa vektor serta bilangan bulat tunggal.
sumber
Melamar berhasil dengan baik, tetapi cukup lambat. Menggunakan sapply dan vapply bisa bermanfaat. rowwise dplyr juga bisa berguna Mari kita lihat contoh bagaimana melakukan produk bijak baris dari setiap bingkai data.
Perhatikan bahwa menugaskan ke variabel sebelum menggunakan vapply / sapply / apply adalah praktik yang baik karena mengurangi banyak waktu. Mari kita lihat hasil microbenchmark
Perhatikan dengan cermat bagaimana t () digunakan
sumber
b <- t(iris[1:10, 1:3])
danapply(b, 2 prod)
.Pendekatan lain jika Anda ingin menggunakan bagian yang bervariasi dari kumpulan data alih-alih satu nilai adalah dengan menggunakan
rollapply(data, width, FUN, ...)
. Menggunakan vektor dengan lebar memungkinkan Anda untuk menerapkan fungsi pada jendela yang bervariasi dari kumpulan data. Saya telah menggunakan ini untuk membangun rutinitas pemfilteran adaptif, meskipun tidak terlalu efisien.sumber