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

R data.table使用所有列生成字符串,r,data.table,R,Data.table,我使用data.table的fread()函数从下载数据并将其加载到R中 对于每一行,我希望data.table以最有效的方式收集所有列中的所有信息,并将其放入单个字符串中。我目前的功能正常工作,但我认为这可能相当缓慢,可能需要从一些数据中进行一些改进 foo <- function(y, dt_obj, col_names=colnames(dt_obj)){ paste0("http://localhost:8080/predict?", paste0(col

我使用
data.table
fread()
函数从下载数据并将其加载到R中

对于每一行,我希望data.table以最有效的方式收集所有列中的所有信息,并将其放入单个字符串中。我目前的功能正常工作,但我认为这可能相当缓慢,可能需要从一些数据中进行一些改进

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="&")
          )
 }
然而,这似乎需要一段时间,并且相信如果创建一个更高效的
foo
函数,或者以更高效的方式使用data.table,速度可能会提高


一如既往,我们将非常感谢您的帮助……

我认为您使用的是
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
system.time({

mat我有一个非常天真的建议。您在读取CSV时是否尝试删除列分隔符?行应该被正确读取,分隔字段的逗号将被视为文本。您的链接被阻止在我的位置。如果有帮助,我发布了示例数据。感谢您的建议,非常简洁……但不幸的是,对于我的情况csv数据只是一个例子…我的数据已经在R中,通常使用readRDS读取,因为它是RDS格式。你能添加一个示例数据集并输出吗?感谢这一点,矩阵的使用很好,但我想保留字符串,我认为在你的示例中可以转换这些字符串…它们是字符串。你在进行什么转换指的是什么?
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