menerapkan fungsi pada variabel bernomor di r

Mengingat kerangka data berikut ('data'):

data <- data.frame(a1 = sample(10), b1 = rep(0,10), c1 = sample(10), 
               a2 = rep(0,10), b2 = sample(10), c2 = sample(10),
               a3 = sample(10), b3 = sample(10), c3 = sample(10))

Dan fungsi yang saya buat untuk membuat perhitungan bergantung pada 3 kondisi:

calcs <- function(a, b, c){
if ((max(a) > 0) & (max(b)>0)){
maxa <- max(a)
maxb <- max(b)
maxc <- max(c)
calc = 75*c/maxc + 12.5*a/maxa + 12.5*b/maxb
}
else if ((max(a) > 0) & (max(b)==0)){
maxa <- max(a)
maxc <- max(c)
calc = 75*c/maxc + 25*a/maxa 
}

else {
maxc <- max(c)
maxb <- max(b)
calc = 75*c/maxc + 25*b/maxb 
}
}

Saya ingin menerapkan fungsi ini ke kerangka data, mengulangi variabel bernomor (dari 1 hingga 3) daripada menggunakan kode berikut:

data$calc1 <- calcs(data$a1,data$b1,data$c1)
data$calc2 <- calcs(data$a2,data$b2,data$c2)
data$calc3 <- calcs(data$a3,data$b3,data$c3)

Saya telah mencari di tempat lain, jelas ini masalah sederhana, tetapi dengan beragam dokumentasi 'alat' di daftar, lapply, dll. Saya tidak yakin tindakan terbaik.


person mkrasmus    schedule 30.11.2016    source sumber


Jawaban (1)


Kita dapat menggunakan Map dengan input subset kolom 'a', 'b', dan 'c' sebagai input.

data[paste0("calc", 1:3)] <- Map(calcs, 
          data[paste0("a", 1:3)], data[paste0("b", 1:3)], data[paste0("c", 1:3)])
person akrun    schedule 30.11.2016
comment
Terima kasih banyak @akrun. Pengenalan yang sangat baik untuk fungsi dasar, di mana saya dapat menggunakan 'fungsi buatan pengguna' di seluruh kerangka data. Sekolah tua. - person mkrasmus; 30.11.2016