在data.frame的行中应用包含char和num参数的函数

时间:2013-03-11 21:05:51

标签: r

我正在尝试将函数应用于数据帧的每一行。该函数使用chars和nums的组合作为参数。

这不是聚合练习,而是现有data.frame中新字段的定义,基于使用char和num变量的一系列条件。所有变量都在data.frame中。

我知道apply函数将数据帧行转换为向量,在本例中为char向量:我想避免在函数中重新构建数据框变量。

有几个关于如何使用applyplyr包在data.frame行中运行函数的帖子,但是从我的新手角度来看 - 这些示例不会混合使用char和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])
}

2 个答案:

答案 0 :(得分:3)

只需使用mapply plyr 等效mlply

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

答案 1 :(得分: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

编辑错字错误&amp;&amp;没有矢量化所以我用&amp ;.替换它(感谢@joran)