我想加入两个data.table(形成其笛卡尔积)。 data.table之一在Date向量上键入,另一个在numeric向量上键入:

# data.table with dates (as numeric)
dtDates2 = data.table(date =
                       as.numeric(seq(from = as.Date('2014/01/01'),
                           to = as.Date('2014/07/01'), by = 'weeks')),
                     data1 = rnorm(26))

# data.table with dates
dtDates1 = data.table(date =
                        seq(from = as.Date('2014/01/01'),
                            to = as.Date('2014/07/01'), by = 'weeks'),
                      data1 = rnorm(26))


# data.table with customer IDs
dtCustomers = data.table(customerID = seq(1, 100),
                      data2 = rnorm(100))

setkey并尝试使用CJ交叉加入它们:
# cross join the two datatables
setkey(dtCustomers, customerID)
setkey(dtDates1, date)
setkey(dtDates2, date)

CJ(dtCustomers, dtDates1)
CJ(dtCustomers, dtDates2)

但出现以下错误:
Error in FUN(X[[1L]], ...) :
  Invalid column: it has dimensions. Can't format it. If it's the result of data.table(table()), use as.data.table(table()) instead.

不知道我在做什么错。

最佳答案

开箱即用的data.table中没有交叉连接功能。
但是在CJ.dt包(在CRAN中可用)中提供了CJ函数(类似于optiRum,但专为data.tables设计)以实现笛卡尔乘积(交叉联接)。
您可以创建函数:

CJ.dt = function(X,Y) {
  stopifnot(is.data.table(X),is.data.table(Y))
  k = NULL
  X = X[, c(k=1, .SD)]
  setkey(X, k)
  Y = Y[, c(k=1, .SD)]
  setkey(Y, NULL)
  X[Y, allow.cartesian=TRUE][, k := NULL][]
}
CJ.dt(dtCustomers, dtDates1)
CJ.dt(dtCustomers, dtDates2)

但是,为了方便地执行交叉连接,使用FR填充了data.table#1717,因此您可以检查那里是否有更好的api用于交叉连接。

关于R:data.table交叉联接不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25888706/

10-13 00:09