我正在尝试将函数应用于数据帧的每一行。该函数使用chars和nums的组合作为参数。
这不是聚合练习,而是现有data.frame中新字段的定义,基于使用char和num变量的一系列条件。所有变量都在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])
}
答案 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)