我想在数据表中做一个看似简单的 mapply 应用。我想将一系列数据表列乘以另一列中的值。这是我的功能。 y 是与其他列中的值相乘的单列。 xIn 是一个列名来做这个操作。
f.xRatio <- function(xIn, y) {return(y * (xIn + 1)/(xIn - 1))}
我有一个数据表,其中有一个名为 GDPratio 的列和一些名为的列
x.food1、x.food2 等。我将这些列名放入一个名为 x 的变量中
x <- paste0("x.", foodNames)
我用函数创建的新列的名称创建另一个变量
xRatio <- paste0("xRatio.", foodNames)
这是我尝试使用 mapply 从函数创建 xRatio 列的两个版本。
dt[, (xRatio) := mapply(FUN = f.xRatio, xIn = .SD, y = GDPRatio), .SDcols = (x)]
dt[, (xRatio) := mapply(FUN = f.xRatio, xIn = .(x), y = GDPRatio)]
两者都不起作用。我认为第一个很接近。我希望有人可以指出我的逻辑中的缺陷,而无需我创建一个可重复的示例。
最佳答案
如果我们使用 Map/mapply
,请确保将单列“GDPRatio”括在 list
中将其视为在 list
上回收的单个单元.SD
中的列数.
dt[, (xRatio) := Map(f.xRatio, .SD, list(GDPRatio)), .SDcols = x]
否则,单位将是
vector
中的单个元素并与 .SD
的相应列一起回收并导致 length
OP 代码中所述的问题dt[, (xRatio) := Map(f.xRatio, .SD, GDPRatio), .SDcols = x]
Warning messages: 1: In mapply(FUN = f, ..., SIMPLIFY = FALSE) :
longer argument not a multiple of length of shorter 2: In[.data.table
(dt, ,:=
((xRatio), Map(f.xRatio, .SD, GDPRatio)), : Supplied 2 columns to be assigned a list (length 5) of values (3 unused)
数据
foodNames <- c("food1", "food2")
x <- paste0("x.", foodNames)
xRatio <- paste0("xRatio.", foodNames)
set.seed(24)
dt <- data.table(x.food1 = 2:6, x.food2 = 6:10, val = rnorm(5),
GDPRatio = c(0.5, 0.2, 0.3, 0.4, 0.1))
关于r 如何将 mapply 与数据表一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50027219/