data.table使用所有列来生成字符串

时间:2015-11-04 13:35:50

标签: r data.table

我已从lending club下载了数据,并使用data.table的{​​{1}}函数将其加载到R中。

对于每一行,我希望data.table能够以最有效的方式收集所有列中的所有信息并将其放入单个字符串中。我当前的功能是有效的,但认为这可能非常缓慢,并且可以处理一些数据方面的改进。在SO的专家。

fread()

在上面的函数中,foo <- function(y, dt_obj, col_names=colnames(dt_obj)){ paste0("http://localhost:8080/predict?", paste0(col_names,"=",unlist(dt_obj[y,],use.names=FALSE), collapse="&") ) } 是行号,y是使用fread读入R的csv数据。

然后我遍历每一行并使用以下行将数据添加到我的原始data.table对象dt_obj

dt

然而,这似乎需要一段时间,并且相信如果创建更高效​​的dt[,strg:=sapply(seq(nrow(dt)),function(x){foo(x,dt_obj=dt)})] 函数或以更有效的方式使用data.table,速度可以提高......

一如既往,我们将非常感谢任何帮助......

1 个答案:

答案 0 :(得分:1)

我认为您正在使用data.table来处理未使用其独特优势的内容。这是一个简单的矩阵方法base R,当我从Lending Club下载数据集时需要3.5秒:

system.time({
mat <- as.matrix(dt)
a <- apply(mat, 1, function(x) paste(colnames(mat), unlist(x), sep="="))
newvec <- paste0("http://localhost:8080/predict?", apply(a, 2, paste, collapse="&"))
})
#   user  system elapsed 
#   3.50    0.03    3.54 

#compare to your original function
system.time(
+ dt[,strg:=sapply(seq(nrow(dt)),function(x){foo(x,dt_obj=dt)})]
+ )
#   user  system elapsed 
# 135.45    0.03  136.02

all.equal(newvec[1], dt[1,strg])
#[1] TRUE