Эффективная альтернатива merge () при построении фрейма данных из файлов json с помощью R?

Я написал следующий код, который работает, но становится очень медленным, когда я начинаю выполнять его для тысяч записей:

require("RJSONIO")
people_data <- data.frame(person_id=numeric(0))

json_data <- fromJSON(json_file)
n_people <- length(json_data)
for(person in 1:n_people) {
        person_dataframe <- as.data.frame(t(unlist(json_data[[person]])))
        people_data <- merge(people_data, person_dataframe, all=TRUE)
    }

output_file <- paste("people_data",".csv")
write.csv(people_data, file=output_file)

Я пытаюсь построить единую таблицу данных из серии файлов в формате json. Функция fromJSON () считывает данные в виде списков списков. Каждый элемент списка - это человек, который затем содержит список атрибутов этого человека.

Например:

[[1]]
    person_id
    name
    gender
    hair_color
[[2]]
    person_id
    name
    location
    gender
    height

[[...]]

structure(list(person_id = "Amy123", name = "Amy", gender = "F",
               hair_color = "brown"), 
          .Names = c("person_id", "name", "gender", "hair_color"))

structure(list(person_id = "matt53", name = "Matt", 
               location = structure(c(47231, "IN"), 
                                    .Names = c("zip_code", "state")), 
               gender = "M", height = 172), 
          .Names = c("person_id", "name", "location", "gender", "height"))

Конечным результатом приведенного выше кода является матрица, в которой столбцы представляют собой каждый атрибут человека, который появляется в структура выше, а строки - соответствующие значения для каждого человека. Однако, как вы можете видеть, некоторые данные отсутствуют для некоторых людей, поэтому мне нужно убедиться, что они отображаются как NA , и убедиться, что они попадают в нужные столбцы. В дальнейшем, location сам по себе является вектором с двумя компонентами: state и zip_code , что означает, что его необходимо выровнять до location.state и ] location.zip_code перед тем, как его можно будет объединить с записью другого человека; для этого я использую unlist () . Затем я сохраняю текущую главную таблицу в people_data .

Приведенный выше код работает, но знаете ли вы более эффективный способ выполнить то, что я пытаюсь сделать? Похоже, что merge () замедляет сканирование ... У меня есть сотни файлов с сотнями людей в каждом файле.

Спасибо! состояние и location.zip_code перед тем, как его можно будет объединить с записью другого человека; для этого я использую unlist () . Затем я сохраняю текущую главную таблицу в people_data .

Приведенный выше код работает, но знаете ли вы более эффективный способ выполнить то, что я пытаюсь сделать? Похоже, что merge () замедляет сканирование ... У меня есть сотни файлов с сотнями людей в каждом файле.

Спасибо! состояние и location.zip_code перед тем, как его можно будет объединить с записью другого человека; для этого я использую unlist () . Затем я сохраняю текущую главную таблицу в people_data .

Приведенный выше код работает, но знаете ли вы более эффективный способ выполнить то, что я пытаюсь сделать? Похоже, что merge () замедляет сканирование ... У меня есть сотни файлов с сотнями людей в каждом файле.

Спасибо! м пытаюсь сделать? Похоже, что merge () замедляет сканирование ... У меня есть сотни файлов с сотнями людей в каждом файле.

Спасибо! м пытаюсь сделать? Похоже, что merge () замедляет сканирование ... У меня есть сотни файлов с сотнями людей в каждом файле.

Спасибо! Брайан

ОБНОВЛЕНИЕ: Основываясь на обратной связи ниже, я попытался составить список всех людей, а затем преобразовать все это за один раз в фреймворк данных. Я позволил ему поработать всю ночь и все еще не закончил создание фрейма данных. В списке около 1/2 миллиона человек. Этот код выглядит так:

require("RJSONIO")
require("plyr")
people_data <- data.frame(person_id=numeric(0))
people_list <- list()

json_data <- fromJSON(json_file)
n_people <- length(json_data)
for(person in 1:n_people) {
        people_list[[person]] <- t(unlist(json_data[[person]]))
    }

#PROBLEM CODE, SLOW, 1/2 million records in people_list
people_data <- rbind.fill(lapply(people_list, as.data.frame))

output_file <- paste("people_data",".csv")
write.csv(people_data, file=output_file)
5
задан Bryan 5 March 2011 в 16:33
поделиться