r 如何将 mapply 与数据表一起使用

标签 r data.table mapply

我想在数据表中做一个看似简单的 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/

相关文章:

r - 使用条件将数据从一个表子集到不同的表中

r - 为什么 intersect(...) 比数据表连接快?

r - R data.table i = MYVAR!=%like% “something|somethingelse|somethingmore”,

r - 如何匹配 ID 号以合并两个数据帧

r - 将已安装的 R 包传输到另一台计算机上的 R

r - 强制mapply返回一个列表?

r - mapply 基础知识? - 如何从两个向量和一个函数创建一个矩阵

r - 如何按数字顺序对带整数的字符串进行排序?

用 R 中该行的最新非 NA 值替换特定列中的 NA

r - 使用 R 检查一个表中的关键字是否在另一表中的字符串内