我已经将一个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
?
帮助非常感谢!
答案 0 :(得分:3)
这是一种通过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.