2015-11-04 2 views
2

Я загрузил данные из lending club и загрузил их в R, используя .data.table использовать все столбцы для создания строки

Для каждой строки я хотел бы, чтобы 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 это данные, CSV, который был считан в R с помощью Fread.

я затем пройти через каждую строку и добавить в данных к моему первоначальному data.table объекту dt используя следующую строку

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

Однако это, кажется, занять некоторое время, и считает, что скорость может быть повышена, если более эффективной foo функции были созданы или data.table использовали более эффективным способом ...

Как всегда, любая помощь будет принята с благодарностью ...

+0

У меня есть очень наивное предложение. Вы пытались удалить разделитель столбцов во время чтения CSV? Строки должны читаться правильно, а запятые, разделяющие поля, будут рассматриваться как текст. –

+0

ваша ссылка заблокирована из моего местоположения. Я разместил образцы данных, если это поможет. –

+0

Спасибо за предложение, довольно аккуратное ... но, к сожалению, для моей ситуации данные csv - всего лишь пример ... мои данные уже находятся в R, который обычно читается при использовании readRDS, так как это формат RDS. –

ответ

1

Я думаю, что вы используете data.table для чего-то, что не использует его уникальные сильные стороны. Вот простой метод матрицы с base R что взял 3,5 секунды, когда я скачал набор данных из Lending Club:

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

Они являются символьными строками. Какое преобразование вы имеете в виду? –

Смежные вопросы