Я пытаюсь превратить структуру вложенного списка в фреймворк данных. Список похож на следующий (это сериализованные данные из разобранного JSON, считанного с использованием пакета httr).
myList <- list(object1 = list(w=1, x=list(y=0.1, z="cat")), object2 = list(w=NULL, x=list(z="dog")))
EDIT: мои исходные данные примера были слишком простыми. Фактические данные оборваны, а это означает, что для каждого объекта существуют не все переменные, а некоторые из элементов списка - NULL. Я отредактировал данные, чтобы отразить это.
unlist(myList)
отлично справляется с рекурсивным выравниванием списка, и затем я могу использовать lapply
, чтобы сгладить все объекты.
flatList <- lapply(myList, FUN= function(object) {return(as.data.frame(rbind(unlist(object))))})
И, наконец, я могу настроить его, используя plyr::rbind.fill
myDF <- do.call(plyr::rbind.fill, flatList)
str(myDF)
#'data.frame': 2 obs. of 3 variables:
#$ w : Factor w/ 2 levels "1","2": 1 2
#$ x.y: Factor w/ 2 levels "0.1","0.2": 1 2
#$ x.z: Factor w/ 2 levels "cat","dog": 1 2
Проблема заключается в том, что w и x.y теперь интерпретируются как символьные векторы, которые по умолчанию обрабатываются как факторы в кадре данных. Я считаю, что unlist()
является виновником, но я не могу найти другого способа рекурсивно сгладить структуру списка. Обходным решением было бы выполнить пост-обработку кадра данных и затем назначить типы данных. Каков наилучший способ определить, является ли вектор допустимым числовым или целочисленным вектором?