我有两个data.table
我想加入的(形成一个笛卡尔积)。其中一个的data.table
s的键连接在一个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
功能(CJ
类似但专为data.tables设计)可实现optiRum
软件包(可在CRAN中使用)中的笛卡尔积(交叉联接)。
您可以创建函数:
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用于交叉联接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句