2013-03-11 63 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)

相关问题