Создать один фрейм данных из разных столбцов списка - PullRequest
0 голосов
/ 07 февраля 2019

Я импортировал файл json в R. Теперь у меня есть один символьный столбец с уникальными идентификаторами dbc, за которым следуют несколько столбцов списка lookup.company.year, которые содержат фреймы данных.Что я хочу сделать, это сделать один большой кусок (фрейм данных).Я предпочитаю решения с пакетом purrr.

Это только очень маленький фрагмент моих данных:

# A tibble: 1 x 5
  dbc       lookup.CZ.2016       lookup.CZ.2017       lookup.DSW.2016      lookup.DSW.2017     
  <chr>     <list>               <list>               <list>               <list>              
1 019999006 <data.frame [1 × 2]> <data.frame [1 × 2]> <data.frame [1 × 2]> <data.frame [1 × 2]>

С воспроизводимым примером:

library(tidyverse)

df <- structure(list(dbc = "019999006", lookup.CZ.2016 = list(structure(list(
    name = "MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten)", 
    price = 18575.66), class = "data.frame", row.names = 1L)), 
    lookup.CZ.2017 = list(structure(list(name = "Albert Schweitzer Ziekenhuis", 
        price = 23024.57), class = "data.frame", row.names = 1L)), 
    lookup.DSW.2016 = list(structure(list(name = "MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten)", 
        price = 21991L), class = "data.frame", row.names = 1L)), 
    lookup.DSW.2017 = list(structure(list(name = "Albert Schweitzer Ziekenhuis", 
        price = 23603.59), class = "data.frame", row.names = 1L)), 
    lookup.Menzis.2018 = list(NULL)), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"))

И желаемый результат:

# A tibble: 4 x 5
  dbc      company year name                                            price
     <dbl> <chr> <dbl> <chr>                                              <dbl>
1 19999006 CZ     2016 MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 18576.
2 19999006 CZ     2017 Albert Schweitzer Ziekenhuis                      23025.
3 19999006 DSW    2016 MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 21991 
4 19999006 DSW    2017 Albert Schweitzer Ziekenhuis                      23604.

У меня также есть NULL значения.Я хочу исключить их, поэтому я включил один в примерный набор данных.

Обновление

Как можно исключить пустые list() из набора данных, отличные от NULL?

enter image description here

Помощь очень ценится!

1 Ответ

0 голосов
/ 07 февраля 2019

Вот путь через tidyverse (не нужно purrr),

library(tidyverse)

df %>% 
 gather(var, val, -dbc) %>% 
 group_by(grp = sub('^.*\\.(.*)\\..*', '\\1', var)) %>% 
 filter(val != 'NULL') %>% 
 unnest()

, который дает,

# A tibble: 4 x 5
# Groups:   grp [2]
  dbc       var             grp   name                                               price
  <chr>     <chr>           <chr> <chr>                                              <dbl>
1 019999006 lookup.CZ.2016  CZ    MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 18576.
2 019999006 lookup.CZ.2017  CZ    Albert Schweitzer Ziekenhuis                      23025.
3 019999006 lookup.DSW.2016 DSW   MC Groep (Zuiderzee Lelystad, Emmeloord, Dronten) 21991 
4 019999006 lookup.DSW.2017 DSW   Albert Schweitzer Ziekenhuis                      23604.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...