Arhn - архитектура программирования

tidyverse - предпочтительный способ превратить именованный вектор в data.frame / tibble

При частом использовании tidyverse я часто сталкиваюсь с проблемой превращения именованных векторов в _2 _ / _ 3_, где столбцы являются именами вектора.
Какой способ сделать это предпочтительнее?
РЕДАКТИРОВАТЬ: это связано с: this и this github-issue

Я хочу:

require(tidyverse)
vec <- c("a" = 1, "b" = 2)

чтобы стать этим:

# A tibble: 1 × 2
      a     b
  <dbl> <dbl>
1     1     2

Я могу сделать это, например:

vec %>% enframe %>% spread(name, value)
vec %>% t %>% as_tibble

Пример использования:

require(tidyverse)
require(rvest)
txt <- c('<node a="1" b="2"></node>',
         '<node a="1" c="3"></node>')

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(~t(.) %>% as_tibble)

Который дает

# A tibble: 2 × 3
      a     b     c
  <chr> <chr> <chr>
1     1     2  <NA>
2     1  <NA>     3
14.10.2016

  • Что именно, если чего-то не хватает, по вашему мнению, в том, что вы делаете (?) 14.10.2016
  • Я себе то же самое задавал, потому что bind_rows не работает вместо map_df(~t(.) %>% as_tibble). Итак, до сих пор я транспонировал, конвертировал во фрейм данных со строками, оставшимися символами (а не факторами), а затем связываю результаты вместе. Однако было бы неплохо найти ярлык для этой общей задачи. 14.10.2016
  • @lukeA, я думаю, bind_rows был обновлен, чтобы теперь работать так, как вы хотите 19.09.2017

Ответы:


1

Теперь это напрямую поддерживается с помощью bind_rows (введено в dplyr 0.7.0):

library(tidyverse)) 
vec <- c("a" = 1, "b" = 2)

bind_rows(vec)
#> # A tibble: 1 x 2
#>       a     b
#>   <dbl> <dbl>
#> 1     1     2

Это цитата из https://cran.r-project.org/web/packages/dplyr/news.html объясняет изменение:

bind_rows() и bind_cols() теперь принимают векторы. В первом случае они рассматриваются как строки, а во втором - столбцы. Для строк требуются внутренние имена, такие как c(col1 = 1, col2 = 2), а для столбцов требуются внешние имена: col1 = c(1, 2). Списки по-прежнему обрабатываются как фреймы данных, но их можно явно объединить с помощью !!!, например. bind_rows(!!! x) (# 1676).

С этим изменением это означает, что следующая строка в примере варианта использования:

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(~t(.) %>% as_tibble)

можно переписать как

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(bind_rows)

что также эквивалентно

txt %>% map(read_xml) %>% map(xml_attrs) %>% { bind_rows(!!! .) }

Эквивалентность различных подходов демонстрируется в следующем примере:

library(tidyverse)
library(rvest)

txt <- c('<node a="1" b="2"></node>',
         '<node a="1" c="3"></node>')

temp <- txt %>% map(read_xml) %>% map(xml_attrs)

# x, y, and z are identical
x <- temp %>% map_df(~t(.) %>% as_tibble)
y <- temp %>% map_df(bind_rows)
z <- bind_rows(!!! temp)

identical(x, y)
#> [1] TRUE
identical(y, z)
#> [1] TRUE

z
#> # A tibble: 2 x 3
#>       a     b     c
#>   <chr> <chr> <chr>
#> 1     1     2  <NA>
#> 2     1  <NA>     3
18.09.2017
  • Меня немного смущает различие между установкой внутренних имен и внешних имен, которые вы цитируете. См. Мой вопрос здесь: stackoverflow.com/q/67010860/5535152 09.04.2021

  • 2

    Идиоматическим способом было бы соединить вектор с !!! в вызове tibble(), чтобы названные векторные элементы стали определениями столбцов:

    library(tibble)
    vec <- c("a" = 1, "b" = 2)
    tibble(!!!vec)
    #> # A tibble: 1 x 2
    #>       a     b
    #>   <dbl> <dbl>
    #> 1     1     2
    

    Создано 14 сентября 2019 г. пакетом REPEX (v0.3.0)

    14.09.2019

    3

    У меня работает: c("a" = 1, "b" = 2) %>% t() %>% tbl_df()

    18.09.2017

    4

    Интересно, что вы можете использовать метод as_tibble() для списков, чтобы сделать это за один вызов. Обратите внимание, что это не лучшая практика, поскольку это не экспортируемый метод.

    tibble:::as_tibble.list(vec)
    
    18.09.2017
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..