首页 > 解决方案 > 如何从简单的 tibble 中创建详细和分类的 tibble

问题描述

我的问题是如何创建应该如下所示的 tibble 或数据框:

它应该是什么样子

因此,JEL 代码应按字母、字母和第一个数字分组,然后按字母和两个数字分组。到目前为止,我无法从 JEL_codes 中提取字母,因为它是一个列表,当我提取它时,这个列表比卷列表长,我无法再创建一个小标题。

目前,我的 tibble 看起来像这样,在那里我观察到了 JEL_codes 和音量:

现在的样子

也许作为第一步,我会分离观察结果,以便一个 JEL 代码与一个 volume 匹配,因此没有两个 JEL 代码在一行中。任何能给我带来进一步帮助的东西都对我有帮助,非常感谢!

标签: rdataframedplyrtibble

解决方案


也许这就是你正在寻找的:

顺便说一句:为了帮助我们帮助您,您能否通过共享您的数据样本、您尝试的代码和您使用的软件包来重现您的问题?了解如何制作一个最小的可重现示例将您的数据类型发布dput(NAME_OF_DATASET)到控制台中,然后将输出以开头的内容复制并粘贴structure(....到您的帖子中。

library(tidyr)
library(tibble)
library(dplyr)

d <- tibble(
  JEL_codes = list(c("Q54", "Q58"), c("Q15", "Q25"), "H23"),
  volume = c(2, 3, 6)
)

d %>% 
  unnest(JEL_codes) %>% 
  mutate(JEL_code1 = gsub("^([A-Z]).+", "\\1", JEL_codes),
         JEL_code2 = gsub("^([A-Z]\\d).+", "\\1", JEL_codes)) %>% 
  select(JEL_code1, JEL_code2, JEL_code3 = JEL_codes, volume) %>%
  pivot_longer(-volume, names_to = "foo", values_to = "jel_code") %>% 
  select(-foo) %>% 
  count(jel_code, volume, sort = TRUE) %>% 
  pivot_wider(names_from = volume, values_from = n, values_fill = 0) %>% 
  arrange(jel_code)
#> # A tibble: 11 x 4
#>    jel_code   `2`   `3`   `6`
#>    <chr>    <int> <int> <int>
#>  1 H            0     0     1
#>  2 H2           0     0     1
#>  3 H23          0     0     1
#>  4 Q            2     2     0
#>  5 Q1           0     1     0
#>  6 Q15          0     1     0
#>  7 Q2           0     1     0
#>  8 Q25          0     1     0
#>  9 Q5           2     0     0
#> 10 Q54          1     0     0
#> 11 Q58          1     0     0

推荐阅读