使用R中的data.table包,我试图使用merge方法创建两个data.tables的笛卡尔积,就像在基数R中一样.
在基础上,以下工作:
#assume this order data
orders <- data.frame(date = as.POSIXct(c('2012-08-28','2012-08-29','2012-09-01')),
first.name = as.character(c('John','George','Henry')),
last.name = as.character(c('Doe','Smith','Smith')),
qty = c(10,50,6))
#and these dates
dates <- data.frame(date = seq(from = as.POSIXct('2012-08-28'),
to = as.POSIXct('2012-09-07'), by = 'day'))
#get the unique customers
cust<-unique(orders[,c('first.name','last.name')])
#using merge from base R, get the cartesian product
merge(dates, cust, by = integer(0))
Run Code Online (Sandbox Code Playgroud)
但是,使用data.table相同的技术不起作用,并抛出此错误:
"merge.data.table中的错误(dates.dt,cust.dt,by = integer(0)):需要一个非空的列名向量__CODE__."
"Error in merge.data.table(dates.dt, cust.dt, by = integer(0)) :
A non-empty vector of column names for `by` is required."
Run Code Online (Sandbox Code Playgroud)
我希望结果反映所有日期的所有客户名称,就像在base中一样,但是以data.table为中心的方式.这可能吗?
我正在尝试使用gWidgetsWWW并遇到一个奇怪的错误.我创建了一个带有处理程序的按钮,用于knit2html报告,该报告使用了data.table赋值运算符":=".报告回来时出现了这个错误:
错误:: =定义仅用于j,并且(当前)仅用于一次; 即,DT [i,col:= 1L]和DT [,newcol:= sum(colB),by = colA]可以,但不是DT [i,col]:= 1L,而不是DT [i] $ col: = 1L而不是DT [,{newcol1:= 1L; newcol2:= 2L}].请参阅帮助(":=").检查is.data.table(DT)是否为TRUE.
该报告直接使用knit2html生成,也通过RStudio的"Knit HTML"按钮生成,所以我不确定为什么它会在处理程序调用knit2html时失败.
这是一个gWidgetsWWW窗口"test_gui.R":
library(gWidgetsWWW)
library(knitr)
w<-gwindow("Test Window")
g<-ggroup(horizontal=F,cont=w)
b<-gbutton("Report Button",cont=g,handler=function(h,...){
knit2html("test_report.Rmd")
localServerOpen("test_report.html")
})
visible(w)<-T
Run Code Online (Sandbox Code Playgroud)
这是一个产生错误的R Markdown Doc示例:
Test Report
===========
```{r test_chunk}
library(data.table)
df<-data.frame(State=rownames(USArrests),USArrests)
data.table(df)[,State:=tolower(State)]
```
Run Code Online (Sandbox Code Playgroud)
不知道为什么,但是当我调用localServerOpen("test_gui.R")并单击按钮时,我收到错误...
有任何想法吗?