2013-03-11 68 views
0

我試圖將函數應用於數據框的每一行。該函數使用chars和nums的組合作爲參數。沿着data.frame的行應用char和num參數的函數

這不是一個聚合練習,而是基於一系列使用char和num變量的條件定義現有data.frame中的新字段。所有變量都在data.frame中。

我知道apply函數將數據幀行變成一個向量,在這種情況下是一個char向量:我想避免在函數中重新投射數據幀變量。

有關於如何使用apply多個崗位和plyr包能碰到data.frame行的功能,但我 - 從新手standpoint-的例子不按行的基礎上連續混合字符和num參數。謝謝。

condsIdx <- function(IDa,IDb,clss){ 
    if (clss == 'a'){ 
    y = IDa 
    } else if (clss == 'b' && IDb > 14) { 
    y = IDb 
    } else { 
    y = -1 
    } 
    y 
} 

df <- data.frame(IDa=c(1,2,3,4,5,6), 
        IDb=c(11,12,13,14,15,16), 
        clss=c('a','a','a','b','b','c')) 


df$res <- -1 
for (i in 1:nrow(df)){ 
    df$res[i] <- condsIdx(df$IDa[i],df$IDb[i],df$clss[i]) 
} 

回答

3

只需使用mapplyplyr相當於mlply

mapply(condsIdx,IDa = df$IDa,IDb = df$IDb,clss = df$clss) 
[1] 1 2 3 -1 15 -1 
+0

我覺得'mdply(df,condsIdx)'也許是'plyr'最合適的實現方式 – mnel 2013-03-11 22:11:01

3

您可以使用ifelse這裏得到一個量化的解決方案:

transform(df, res = ifelse (clss == 'a', 
          IDa, 
          ifelse(clss == 'b' & IDb > 14,IDb, -1))) 


    IDa IDb clss res 
1 1 11 a 1 
2 2 12 a 2 
3 3 13 a 3 
4 4 14 b -1 
5 5 15 b 15 
6 6 16 c -1 

編輯一個錯字錯誤& &不是所以我把它替換成&(謝謝@joran)

相關問題