Как извлечь список имен и значений в информационный кадр - PullRequest
0 голосов
/ 30 октября 2018

Я использую Kaggles https://www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries/data

Файл json train для анализа характеристик и данных и применения других алгоритмов, чтобы проверить, могу ли я повысить точность.

Например, у меня есть столбец: характеристики:

Пример:

    l <- structure(list(`4` = c("Dining Room", "Pre-War", "Laundry in Building", 
"Dishwasher", "Hardwood Floors", "Dogs Allowed", "Cats Allowed"
), `6` = c("Doorman", "Elevator", "Laundry in Building", "Dishwasher", 
"Hardwood Floors", "No Fee"), `9` = c("Doorman", "Elevator", 
"Laundry in Building", "Laundry in Unit", "Dishwasher", "Hardwood Floors"
), `10` = list(), `15` = c("Doorman", "Elevator", "Fitness Center", 
"Laundry in Building")), .Names = c("4", "6", "9", "10", "15"
))

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

name     nested list
4        <list = list(c("Dining Room", "Pre-War", "Laundry in Building", 
"Dishwasher", "Hardwood Floors", "Dogs Allowed", "Cats Allowed"))>
6        <list = list(c("Doorman", "Elevator", "Laundry in Building", "Dishwasher", "Hardwood Floors", "No Fee"))>
9        <list = list(c("Doorman", "Elevator", 
"Laundry in Building", "Laundry in Unit", "Dishwasher", "Hardwood Floors"))>  
10       <list = list(c())>
15       <list = list(c("Doorman", "Elevator", "Fitness Center", 
"Laundry in Building")))>

Посоветуйте, пожалуйста, как это сделать.

Я немного запутался, как его преобразовать.

Моя конечная цель - создать информационный кадр со всеми этими объединенными функциями, и каждые 4, 6, 10, 15 ... будут иметь свои собственные 1 и 0, если у них есть эти функции, одна горячая кодировка из них.

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 30 октября 2018

Одним из способов является использование функции data.table::rbindlist() с аргументом fill = TRUE. Это позволяет связывать фреймы данных с разным количеством столбцов. Однако хитрость в вашем случае заключается в том, чтобы пустой фрейм данных появился там же. Для этого мы добавляем оператор if, который создает фрейм данных NA для пустых элементов списка, т.е.

library(data.table)
rbindlist(lapply(l, function(i) {d <- as.data.frame(t(i)); 
                                if(!ncol(d)){d <- data.frame(V1 = NA)}; d}), fill = TRUE)

, что дает,

            V1       V2                  V3                  V4              V5              V6           V7 
1: Dining Room  Pre-War Laundry in Building          Dishwasher Hardwood Floors    Dogs Allowed Cats Allowed 
2:     Doorman Elevator Laundry in Building          Dishwasher Hardwood Floors          No Fee         <NA> 
3:     Doorman Elevator Laundry in Building     Laundry in Unit      Dishwasher Hardwood Floors         <NA> 
4:        <NA>     <NA>                <NA>                <NA>            <NA>            <NA>         <NA> 
5:     Doorman Elevator      Fitness Center Laundry in Building            <NA>            <NA>         <NA> 
...