Exporting Data From R to KDB

Here is the beginnings of a simple routine to convert R data frames to Q format (in this case a dictionary). It uses the S3 dispatch mechanism to handle the conversion of different data types. Extremely basic (I havent even bothered to put in proper file output – just capturing the output of cat) but very quick to knock up.

The code is mainly a top-level function called to_dict:

to_dict <- function(x) {
    cat(substitute(x),":", sep="")
    nms <- names(x)
    for (n in nms) { cat("`",n,sep="") } 
    cat("!(",sep="")
    r <- rep(c(";",")"),times=c(length(nms)-1,1))
    for (i in 1:length(nms)) { cat(qformat(x[[nms[i]]]),r[i],sep="") }
}

Where qformat is a generic S3 function:

qformat <- function(x) {
UseMethod("qformat")
}
 
qformat.default <- function(x) {
cat("",format(x))
}
 
qformat.logical <- function(x) {
cat(ifelse(x==TRUE,"1b","0b"))
}  
  
qformat.factor <- function(x) {
cat("",gsub("\\s","",format(x)), sep="`")
}

It can be used as follows (using the famous Anscombe quartet data):

> write(capture.output(to_dict(anscombe)), 
  file="/tmp/anscombe.q")

Then within a Q session:

q)\l /tmp/anscombe.q
q)anscombe
x1| 10 8 13 9 11 14 6 4 12 7 5
x2| 10 8 13 9 11 14 6 4 12 7 5
x3| 10 8 13 9 11 14 6 4 12 7 5
x4| 8 8 8 8 8 8 8 19 8 8 8
y1| 8.04 6.95 7.58 8.81 8.33 9.96 7.24 4.26 10.84 4.82 5.68
y2| 9.14 8.14 8.74 8.77 9.26 8.1 6.13 3.1 9.13 7.26 4.74
y3| 7.46 6.77 12.74 7.11 7.81 8.84 6.08 5.39 8.15 6.42 5.73
y4| 6.58 5.76 7.71 8.84 8.47 7.04 5.25 12.5 5.56 7.91 6.89