2015-11-04 43 views
2

我已經從lending club下載數據並使用data.tablefread()函數將其加載到R.data.table使用所有列來創建字符串

對於每一行,我都希望data.table能夠以最有效的方式收集所有列中的所有信息並將其放入單個字符串中。我目前的功能是可行的,但是認爲這可能相當緩慢,並且可以從SO上的一些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="&") 
     ) 
} 

在上面的函數,y是行數,dt_obj是指使用的fread讀成R CSV數據。

然後我經過的每一行,並在數據使用以下行

dt[,strg:=sapply(seq(nrow(dt)),function(x){foo(x,dt_obj=dt)})] 

然而,這似乎需要一段時間,相信速度如果能改善添加到我原來的data.table對象dt一個更有效的foo功能創建或以更有效的方式使用data.table ...

一如往常的任何幫助,將不勝感激......

+0

我有一個很幼稚的建議。您是否嘗試在閱讀CSV時刪除列分隔符?應該正確讀取行,分隔字段的逗號將被視爲文本。 – 2015-11-04 14:15:28

+0

你的鏈接被阻止從我的位置。如果有幫助,我發佈了示例數據。 –

+0

感謝您的建議,非常整潔......但不幸的是,對於我的情況,csv數據僅僅是一個例子......我的數據已經在R中,通常使用readRDS讀取它,因爲它是RDS格式。 –

回答

1

我認爲你正在使用data.table對於那些沒有使用其獨特優勢的東西。下面是與base R一個簡單的矩陣方法把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 
+0

謝謝你們,矩陣的使用是好的,但我想保留字符串,我認爲這些字符串在你的例子中被轉換... –

+0

它們是字符串。你指的是什麼轉換? –

相關問題