data.table中单值列与混合格式列表列相乘方法及sapply失效原因
为什么sapply/lapply无法实现该逐行运算需求
错误根因
sapply/lapply仅支持遍历单一输入序列,你写的sapply(b, function(x) x*a)存在明显的行对齐问题:
- 在data.table的j表达式中直接写列名
a,会返回完整的a列list对象list(1,2,3),而非当前循环行对应的a列单个数值 - list类型和数值型做乘法运算,自然会触发
non-numeric argument to binary operator的报错。
mapply正常运行的原因
mapply支持同时遍历多个等长的输入序列,传入a、b两个list列后,每次循环会自动提取两个序列相同位置的元素传入自定义函数:
- 第1次循环取
a[[1]]=1、b[[1]]=11运算得到11 - 第2次循环取
a[[2]]=2、b[[2]]=22运算得到44 - 第3次循环取
a[[3]]=3、b[[3]]=c(33,44)运算得到c(99,132)
完全匹配你逐行运算的需求。
用lapply实现的等价写法
如果要使用lapply实现相同效果,需要手动遍历行索引完成元素对齐:
dt[, t2 := lapply(1:.N, function(i) a[[i]] * b[[i]])]
该写法和mapply实现的逻辑完全一致。
内容的提问来源于stack exchange,提问作者Fabio Correa
相关产品推荐
相关产品推荐

