Преобразование вложенного списка во фрейм данных, кажется, удаляет некоторые записи - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь преобразовать вложенный список (video_details_t) во фрейм данных. Большая часть информации во вложенном списке не должна находиться в конечном фрейме данных, это просто «теги» (и в идеале «id»). Вложенный список состоит из 252 элементов, и каждый элемент структурирован следующим образом:

    $ :List of 4
    ..$ kind    : chr "youtube#videoListResponse"
    ..$ etag    : chr "\"Fznwjl6JEQdo1MGvHOGaz_YanRU/wjb97SA5L1u9pjKF_Wa4GYuJoks\""
    ..$ pageInfo:List of 2
    .. ..$ totalResults  : int 1
    .. ..$ resultsPerPage: int 1
    ..$ items   :List of 1
    .. ..$ :List of 4
    .. .. ..$ kind   : chr "youtube#video"
    .. .. ..$ etag   : chr "\"Fznwjl6JEQdo1MGvHOGaz_YanRU/fJEMmhh4c330M-HX-dZXcMUN_R0\""
    .. .. ..$ id     : chr "Dod4hirL4IU"
    .. .. ..$ snippet:List of 10
    .. .. .. ..$ publishedAt         : chr "2019-11-02T13:00:04.000Z"
    .. .. .. ..$ channelId           : chr "UCa92M881KJO0FqaOUb4xAqg"
    .. .. .. ..$ title               : chr "Making Hydrogen from Water (Ft: The DIY Science Guy)"
    .. .. .. ..$ description         : chr "In which JB attempts to make an electrolytic cell for making hydrogen gas after being inspired by The DIY Scien"| __truncated__
    .. .. .. ..$ thumbnails          :List of 5
    .. .. .. .. ..$ default :List of 3
    .. .. .. .. .. ..$ url   : chr "https://i.ytimg.com/vi/Dod4hirL4IU/default.jpg"
    .. .. .. .. .. ..$ width : int 120
    .. .. .. .. .. ..$ height: int 90
    .. .. .. .. ..$ medium  :List of 3
    .. .. .. .. .. ..$ url   : chr "https://i.ytimg.com/vi/Dod4hirL4IU/mqdefault.jpg"
    .. .. .. .. .. ..$ width : int 320
    .. .. .. .. .. ..$ height: int 180
    .. .. .. .. ..$ high    :List of 3
    .. .. .. .. .. ..$ url   : chr "https://i.ytimg.com/vi/Dod4hirL4IU/hqdefault.jpg"
    .. .. .. .. .. ..$ width : int 480
    .. .. .. .. .. ..$ height: int 360
    .. .. .. .. ..$ standard:List of 3
    .. .. .. .. .. ..$ url   : chr "https://i.ytimg.com/vi/Dod4hirL4IU/sddefault.jpg"
    .. .. .. .. .. ..$ width : int 640
    .. .. .. .. .. ..$ height: int 480
    .. .. .. .. ..$ maxres  :List of 3
    .. .. .. .. .. ..$ url   : chr "https://i.ytimg.com/vi/Dod4hirL4IU/maxresdefault.jpg"
    .. .. .. .. .. ..$ width : int 1280
    .. .. .. .. .. ..$ height: int 720
    .. .. .. ..$ channelTitle        : chr "Good and Basic"
    .. .. .. ..$ tags                :List of 8
    .. .. .. .. ..$ : chr "DIY"
    .. .. .. .. ..$ : chr "diyscienceguy"
    .. .. .. .. ..$ : chr "diy science guy"
    .. .. .. .. ..$ : chr "hydrogen electrolysis"
    .. .. .. .. ..$ : chr "water splitting"
    .. .. .. .. ..$ : chr "hydrogen generator"
    .. .. .. .. ..$ : chr "Good and basic"
    .. .. .. .. ..$ : chr "splitting molecules"
    .. .. .. ..$ categoryId          : chr "22"
    .. .. .. ..$ liveBroadcastContent: chr "none"
    .. .. .. ..$ localized           :List of 2
    .. .. .. .. ..$ title      : chr "Making Hydrogen from Water (Ft: The DIY Science Guy)"
    .. .. .. .. ..$ description: chr "In which JB attempts to make an electrolytic cell for making hydrogen gas after being inspired by The DIY Scien"| __truncated__

В конечном итоге должен быть кадр данных с 252 строками (по одному на каждый из 252 элементов video_tags_t) и столбцом для каждой уникальной записи тега по всем 252 элементам. Вот что я ввел до сих пор:

    just_tags <- map(map(map(video_details_t, "items") %>%
      flatten(), "snippet"), "tags")

Это дает мне вложенный список с 252 элементами, и каждый элемент представляет собой вектор, содержащий все теги. Все идет нормально. Далее я использую следующее, чтобы преобразовать его во фрейм данных:

    df<- rbind_all(lapply(just_tags, data.frame))

Это дает мне фрейм данных с 2165 столбцами, по одному на каждый тег, именно то, что я хочу. Но фрейм данных имеет только 238 строк, когда он должен иметь 252 (по одной на каждый элемент just_tags). Что здесь происходит? Это удаляет повторяющиеся строки во время преобразования?

Я также получаю следующий вывод:

    Warning messages:
    1: 'rbind_all' is deprecated.
    Use 'bind_rows()' instead.
    See help("Deprecated") 
    2: In bind_rows_(x, id = id) :
      Unequal factor levels: coercing to character
    3: In bind_rows_(x, id = id) :
      binding character and factor vector, coercing into character vector
    4: In bind_rows_(x, id = id) :
      binding character and factor vector, coercing into character vector
    5: In bind_rows_(x, id = id) :
      binding character and factor vector, coercing into character vector

Я предполагаю, что они не имеют значения для вывода, так как я думаю, что они просто преобразовывая элементы «тегов» в символы вместо факторов.

Если при преобразовании удаляются повторяющиеся строки, существует ли способ сохранить их, скажем, путем идентификации каждой строки с помощью элемента «id» из оригинала список? Каждый из 252 элементов имеет ровно один элемент «id», и он уникален, поэтому его можно использовать для разграничения каждой из 252 конечных выходных строк во фрейме данных.

Большое спасибо за вашу помощь и, пожалуйста, позвольте мне знай, смогу ли я сделать что-то яснее!

1 Ответ

0 голосов
/ 21 января 2020

Axeman дал правильное решение, насколько я могу судить.

    just_tags <- map(map(map(video_details_t, "items") %>%
          flatten(), "snippet"), "tags")

необходимо было изменять с аргументом '.default = NA' на каждом этапе функцией 'map ()', например так:

    just_tags <- map(map(map(video_details_t, "items", .default = NA) %>%
      flatten(), "snippet", .default = NA), "tags", .default = NA)

После этого запустив

        df<- rbind_all(lapply(just_tags, data.frame))

дал желаемый фрейм данных с 252 строками. У него был дополнительный столбец (2166 вместо 2165), но я предполагаю, что это записи NA ...? В любом случае, проблема, насколько я понимаю, решена.

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