如何将R中的一个data.table除以另一个data.table(按列)?

如何将R中的一个data.table除以另一个data.table(按列)?,r,data.table,R,Data.table,考虑以下几点: data(cars) library(data.table) A <- data.table(cars) B <- data.table(speed = 10, dist = 100) (这是一个玩具示例。我希望将其转换为一个可以在不同数据集上运行的函数。)我们可以使用Map library(data.table) A[, Map(`/`, .SD, B)] # speed dist # 1: 0.4 0.02 # 2: 0.4 0.10 # 3:

考虑以下几点:

data(cars)
library(data.table)
A <- data.table(cars)
B <- data.table(speed = 10, dist = 100)

(这是一个玩具示例。我希望将其转换为一个可以在不同数据集上运行的函数。)

我们可以使用
Map

library(data.table)
A[, Map(`/`, .SD, B)]
#    speed dist
# 1:   0.4 0.02
# 2:   0.4 0.10
# 3:   0.7 0.04
# 4:   0.7 0.22
# 5:   0.8 0.16

akrun
数据。表
解决方案看起来不错。这里我提供了一个替代方案,它不需要任何库

> do.call("rbind", apply(A, 1, function(x) x / B))

您可以复制较短数据帧中的行以与较长数据帧匹配,并直接划分

library(data.table)
A/B[rep(1, nrow(A))]

#    speed dist
# 1:   0.4 0.02
# 2:   0.4 0.10
# 3:   0.7 0.04
# 4:   0.7 0.22
# 5:   0.8 0.16
# 6:   0.9 0.10
# 7:   1.0 0.18
# 8:   1.0 0.26
# 9:   1.0 0.34
#10:   1.1 0.17
#.....

可能是您的另一个选择:
A/as.list(B)
如果我在
base R
中提出建议,您也可以使用
t(t(A)/unlist(B))
以向量化的方式进行此操作,我不知道。谢谢@akrunNeat。你能让
sweep()
工作吗?我不能<代码>扫描(A,2,…)
请参见“当然不要这样做”。这是将data.table转换为矩阵,然后每行运行一个循环,然后rbinds所有结果。这不使用任何“库”的事实并不证明这是一个非常低效/不安全和复杂的操作。如果想要避免使用“库”,他们可以在base R中非常有效地使用,例如,请参见
    speed dist
 1:   0.4 0.02
 2:   0.4 0.10
 3:   0.7 0.04
 4:   0.7 0.22
 5:   0.8 0.16
library(data.table)
A/B[rep(1, nrow(A))]

#    speed dist
# 1:   0.4 0.02
# 2:   0.4 0.10
# 3:   0.7 0.04
# 4:   0.7 0.22
# 5:   0.8 0.16
# 6:   0.9 0.10
# 7:   1.0 0.18
# 8:   1.0 0.26
# 9:   1.0 0.34
#10:   1.1 0.17
#.....