首页 > 解决方案 > 有效地将每一行与整个数据表相乘以实现大数据量

问题描述

尝试以自定义方式多个两个数据表。“dt_data”是基础数据,需要从“dt_matrix”的每一行中取多个。对于小集合,for 循环是可以的。当行数达到百万时如何有效地倍增

dt_data <- data.table('A' = c(1,3,2,1), 'B' = c(2,3,1,4))

dt_matrix <- data.table('A' = c(4,5), 'B' = c(3,2))


    A    B
1:  4    6

2: 12    9

3:  8    3

4:  4   12

5:  5    4

6: 15    6

7: 10    2

8:  5    8

标签: r

解决方案


一个选项是outer在数据集的每个相应列上使用并将其转换为data.table

setDT(data.frame(Map(function(x, y) c(outer(x, y)), dt_data,dt_matrix)))[]
#    A  B
#1:  4  6
#2: 12  9
#3:  8  3
#4:  4 12
#5:  5  4
#6: 15  6
#7: 10  2
#8:  5  8

或者另一个选项crossing来自tidyverse

library(tidyverse)
crossing(dt_data, setnames(dt_matrix, c('A1', 'B1'))) %>%
       transmute(A = A * A1, B = B* B1)

推荐阅读