сделать более быстрый цикл for для R с привязкой кадров данных - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь связать фреймы данных, полученные из данных JSON

Я пытался использовать rbind.fill и цикл for, который работает для небольших данных, но это занимает слишком много времени для данных более 100 КБ.Особенно я хотел бы знать, есть ли какой-нибудь способ векторизации, чтобы сделать это быстрее, чем создание пустого фрейма данных.

большой [1,1] показывает, что список строк json выглядит следующим образом

"[{\"latitude\":3750772,\"longitude\":12714673},
{\"latitude\":3750957,\"longitude\":12714793},
{\"latitude\":3751111,\"longitude\":12714954},
{\"latitude\":3751215,\"longitude\":12715155},
{\"latitude\":3751174,\"longitude\":12715295},
{\"latitude\":3751153,\"longitude\":12715174}]"

из JSONbig [1,1] показывает кадр данных 6 x 2.

library(jsonlite)
library(plyr)
big=fromJSON('RT_data_this_should_be_used_for_rt_analysis.json')
big[1,1]
fromJSON(big[1,1]) #It is a 6 x 2 dataframe
row=nrow(big) #Number of row which also means number of 'rt's

result=data.frame(latitude=integer(), longitude=integer()) #Make an empty dataframe which will store values
for (i in 1:row){
  result=rbind.fill(result,fromJSON(big[i,1])) #Bind the dataframes
}
result[,1]=result[,1]/100000
result[,2]=result[,2]/100000 #Adjust longitude and latitude
result #It would be 6*row x 2 dataframe

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Это не проверено, но, возможно, что-то похожее будет работать:

result_list <- lapply(big[, 1], "fromJSON")
result <- do.call("rbind.fill", result_list)
0 голосов
/ 27 июня 2019

Возможно, это не самый элегантный ответ, но вы можете прочитать массивы в список, а затем использовать функцию Reduce, чтобы связать все строки вместе.


resultlist <- vector(list, row)

for (i in 1:row){
  resultlist[[i]]= fromJSON(big[i,1]))
}

result <- reduce(resultlist, rbind.fill)

Я ожидаю, что это должно быть намного быстрее, так как кадр данных не увеличивается в каждом цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...