沿data.frame的行应用同时具有char和num参数的函数

沿data.frame的行应用同时具有char和num参数的函数,r,R,我试图对数据帧的每一行应用一个函数。该函数使用字符和num的组合作为参数 这不是一个聚合练习,而是基于使用char和num变量的一系列条件在现有data.frame中定义一个新字段。所有变量都在data.frame中 我知道apply函数将数据帧行转换为一个向量,在本例中是一个char向量:我希望避免在函数中重新转换数据帧变量 关于如何使用apply和plyr包跨data.frame行运行函数,有几篇文章发表了,但从新手的角度来看,这些示例并没有逐行混合char和num参数。谢谢 condsId

我试图对数据帧的每一行应用一个函数。该函数使用字符和num的组合作为参数

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

我知道
apply
函数将数据帧行转换为一个向量,在本例中是一个char向量:我希望避免在函数中重新转换数据帧变量

关于如何使用
apply
plyr
包跨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])
}
condsIdx 14){
y=IDb
}否则{
y=-1
}
Y
}

df只需使用
mappy
plyr等效的
mlply

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

只需使用
mappy
plyr等效的
mlply

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

您可以在此处使用
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)

您可以在此处使用
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)

我认为
mdply(df,condsIdx)
可能是使用
plyr最合适的实现
我认为
mdply(df,condsIdx)
可能是使用
plyr最合适的实现