Я довольно часто сталкиваюсь с данными, которые структурированы примерно так:
employees <- list(
list(id = 1,
dept = "IT",
age = 29,
sportsteam = "softball"),
list(id = 2,
dept = "IT",
age = 30,
sportsteam = NULL),
list(id = 3,
dept = "IT",
age = 29,
sportsteam = "hockey"),
list(id = 4,
dept = NULL,
age = 29,
sportsteam = "softball"))
Во многих случаях такие списки могут составлять десятки миллионов единиц времени, поэтому проблемы памяти и эффективность всегда являются проблемой.
Я хотел бы превратить список в кадр данных, но если я запустил:
library(data.table)
employee.df <- rbindlist(employees)
Я получаю ошибки из-за значений NULL. Моя нормальная стратегия заключается в использовании такой функции, как:
nullToNA <- function(x) {
x[sapply(x, is.null)] <- NA
return(x)
}
а затем:
employees <- lapply(employees, nullToNA)
employee.df <- rbindlist(employees)
который возвращает
id dept age sportsteam
1: 1 IT 29 softball
2: 2 IT 30 NA
3: 3 IT 29 hockey
4: 4 NA 29 softball
Однако функция nullToNA очень медленная, когда применяется к 10 миллионам случаев, поэтому было бы хорошо, если бы был более эффективный подход.
Одна точка, которая, как представляется, замедляет процесс вниз, функция is.null может применяться только к одному элементу за раз (в отличие от is.na, который может сканировать полный список за один раз).
Любые советы по эффективному использованию этой операции в большом наборе данных?