ใช้ฟังก์ชันกับตัวแปรตัวเลขใน r

รับ dataframe ต่อไปนี้ ('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))

และฟังก์ชันที่ฉันสร้างขึ้นเพื่อทำการคำนวณขึ้นอยู่กับ 3 เงื่อนไข:

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 
}
}

ฉันต้องการใช้ฟังก์ชันนี้กับ dataframe โดยวนซ้ำตัวแปรที่เป็นตัวเลข (ตั้งแต่ 1 ถึง 3) แทนที่จะใช้โค้ดต่อไปนี้:

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)

ฉันได้ดูที่อื่นซึ่งเห็นได้ชัดว่าเป็นปัญหาง่าย ๆ แต่ด้วยเอกสารประกอบ 'เครื่องมือ' ที่หลากหลายในรายการ lapply ฯลฯ ฉันไม่แน่ใจว่าเป็นแนวทางปฏิบัติที่ดีที่สุด


person mkrasmus    schedule 30.11.2016    source แหล่งที่มา


คำตอบ (1)


เราสามารถใช้ Map กับอินพุตของคอลัมน์ย่อย 'a', 'b' และ 'c' เป็นอินพุต

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
ขอบคุณมากครับ @akrun การแนะนำฟังก์ชันพื้นฐานที่ยอดเยี่ยม โดยที่ฉันสามารถใช้ 'ฟังก์ชันที่ผู้ใช้สร้าง' ข้าม dataframe ได้ โรงเรียนเก่า. - person mkrasmus; 30.11.2016