2016-11-30 42 views
2

考慮下面的數據框(「數據」):應用功能跨越編號變量R中

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

和一個功能,我創建進行計算依賴於三個條件:

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

我會喜歡將此功能應用於數據幀,循環顯示編號變量(從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等我不知道最好的行動方針。

回答

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

非常感謝@akrun。對基礎函數的精彩介紹,我可以在數據框中使用我的'用戶創建函數'。老套。 – mkrasmus

+0

@mkrasmus謝謝你的提示。你也可以勾選[here](http://stackoverflow.com/help/someone-answers) – akrun