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