R中对数据框逐行应用自定义函数应选用哪个apply族函数?
原有代码问题说明
你编写的lapply调用不符合预期的核心原因是:lapply仅支持遍历单个输入序列,你传入的x=df$x、y=df$y、z=df$z都是完整的列向量,每次调用sumfunc时只会把单个a值和完整的3个列向量传入计算,得到的每个返回结果都是长度为4的向量,无法满足逐行计算的要求。
推荐解决方案:使用mapply
mapply是apply族中专门支持多参数并行遍历的函数,会自动把多个输入序列的对应位置元素逐个传入自定义函数,刚好匹配你的需求,代码如下:
abc <- mapply(FUN = sumfunc, df$a, df$x, df$y, df$z)
运行后得到的abc就是长度为4的数值向量,结果为5 9 12 15,和预期完全一致。
其他可选apply族方案:使用apply按行遍历
你也可以用apply指定按行(MARGIN=1)遍历数据框实现需求,代码如下:
abc <- apply(df, MARGIN = 1, function(row) { sumfunc(as.numeric(row["a"]), as.numeric(row["x"]), as.numeric(row["y"]), as.numeric(row["z"])) })
注意:apply会先把数据框转为矩阵,如果你的数据框存在非数值列,会出现类型转换问题,这类场景下优先选择mapply。
内容的提问来源于stack exchange,提问作者K.RAC
相关产品推荐
相关产品推荐

