【发布时间】:2021-12-17 09:38:43
【问题描述】:
我有以下data.table,我希望将a列乘以b列,a总是一个数字,b列有时可能是一个向量:
library(data.table)
tt <- c(33,44)
dt <- data.table(a=list(1,2,3)
, b = list(11,22,tt))
dt[, t2 := sapply(b, function(x) x*a)]
我收到一个错误:Error in x * a : non-numeric argument to binary operator
因为 a 始终是一个数字,所以我预计第 3 行会起作用,即使 b 是一个向量。
我找到的解决方案是使用mapply:
dt[, t2 := mapply(function(x,y) x*y, a, b)]
为什么它不适用于 sapply/lapply?
【问题讨论】:
-
'a' 和 'b' 都是列表。您想乘以列表列的相应元素。因此,可以使用
Map或mapply。sapply您正在循环遍历单个列,并将“a”的整个列表与“b”的每个元素相乘。在第一个中,您正在做3 * list(1:3) Error in 3 * list(1:3) : non-numeric argument to binary operator -
同上...要清楚,
dt[, t2 := Map(`*`, a, b)]。
标签: r data.table