如何使用map *和mutate将列表转换为一组其他列?

弗朗西斯·巴顿

实际上,我已经尝试了数百种这种代码的排列,以期获得能够满足我想要的功能的函数,最后我放弃了。感觉绝对应该可行,而且我非常亲密!

我尝试通过下面的reprex回到这里的小问题。

基本上,我有一个单行数据帧,其中的 一列包含 一个字符串列表(“概念”)。我想为每个字符串创建一个附加列mutate,最好使用,使该列从字符串中获取名称,然后用函数调用的结果填充该列(对于哪个函数,这并不重要现在吗?-我只需要功能的基础结构即可。)

像往常一样,我觉得我必须丢失一些明显的东西……也许只是语法错误。我也想知道是否需要使用purrr::map,也许更简单的矢量化映射会正常工作。

我觉得新列是命名的,..1而不是概念名称,这是关于什么地方出错的线索。

我可以通过手动调用每个概念来创建所需的数据框架(请参阅reprex的结尾),但是由于不同数据框架的概念列表不同,因此我想使用管道和tidyverse技术对其进行功能化,而不是手动进行。

我已阅读以下问题以寻求帮助:

但是这些都没有帮助我解决我遇到的问题。[编辑:在最后一个q中添加了该列表,这可能是我需要的技术]。

<!-- language-all: lang-r -->


    # load packages -----------------------------------------------------------

    library(rlang)
    library(dplyr)
    library(tidyr)
    library(magrittr)
    library(purrr)
    library(nomisr)



    # set up initial list of tibbles ------------------------------------------

    df <- list(
      district_population = tibble(
        dataset_title = "Population estimates - local authority based by single year",
        dataset_id = "NM_2002_1"
      ),
      jsa_claimants = tibble(
        dataset_title = "Jobseeker\'s Allowance with rates and proportions",
        dataset_id = "NM_1_1"
      )
    )


    # just use the first tibble for now, for testing --------------------------
    # ideally I want to map across dfs through a list -------------------------

    df <- df[[1]]

    # nitty gritty functions --------------------------------------------------

    get_concept_list <- function(df) {
      dataset_id <- pluck(df, "dataset_id")
      nomis_overview(id = dataset_id,
                     select = c("dimensions", "codes")) %>%
        pluck("value", 1, "dimension") %>%
        filter(!concept == "geography") %>%
        pull("concept")
    }

    # get_concept_list() returns the strings I need:
    get_concept_list(df)
    #> [1] "time"     "gender"   "c_age"    "measures"

    # Here is a list of examples of types of map* that do various things,
    # none of which is what I need it to do
    # I'm using toupper() here for simplicity - ultimately I will use
    # get_concept_info() to populate the new columns

    # this creates four new tibbles
    get_concept_list(df) %>% 
      map(~ mutate(df, {{.x}} := toupper(.x)))
    #> [[1]]
    #> # A tibble: 1 x 3
    #>   dataset_title                                               dataset_id ..1  
    #>   <chr>                                                       <chr>      <chr>
    #> 1 Population estimates - local authority based by single year NM_2002_1  TIME 
    #> 
    #> [[2]]
    #> # A tibble: 1 x 3
    #>   dataset_title                                               dataset_id ..1   
    #>   <chr>                                                       <chr>      <chr> 
    #> 1 Population estimates - local authority based by single year NM_2002_1  GENDER
    #> 
    #> [[3]]
    #> # A tibble: 1 x 3
    #>   dataset_title                                               dataset_id ..1  
    #>   <chr>                                                       <chr>      <chr>
    #> 1 Population estimates - local authority based by single year NM_2002_1  C_AGE
    #> 
    #> [[4]]
    #> # A tibble: 1 x 3
    #>   dataset_title                                               dataset_id ..1    
    #>   <chr>                                                       <chr>      <chr>  
    #> 1 Population estimates - local authority based by single year NM_2002_1  MEASUR~

    # this throws an error
    get_concept_list(df) %>% 
      map_chr(~ mutate(df, {{.x}} := toupper(.x)))
    #> Error: Result 1 must be a single string, not a vector of class `tbl_df/tbl/data.frame` and of length 3

    # this creates three extra rows in the tibble
    get_concept_list(df) %>% 
      map_df(~ mutate(df, {{.x}} := toupper(.x)))
    #> # A tibble: 4 x 3
    #>   dataset_title                                               dataset_id ..1    
    #>   <chr>                                                       <chr>      <chr>  
    #> 1 Population estimates - local authority based by single year NM_2002_1  TIME   
    #> 2 Population estimates - local authority based by single year NM_2002_1  GENDER 
    #> 3 Population estimates - local authority based by single year NM_2002_1  C_AGE  
    #> 4 Population estimates - local authority based by single year NM_2002_1  MEASUR~

    # this does the same as map_df
    get_concept_list(df) %>% 
      map_dfr(~ mutate(df, {{.x}} := toupper(.x)))
    #> # A tibble: 4 x 3
    #>   dataset_title                                               dataset_id ..1    
    #>   <chr>                                                       <chr>      <chr>  
    #> 1 Population estimates - local authority based by single year NM_2002_1  TIME   
    #> 2 Population estimates - local authority based by single year NM_2002_1  GENDER 
    #> 3 Population estimates - local authority based by single year NM_2002_1  C_AGE  
    #> 4 Population estimates - local authority based by single year NM_2002_1  MEASUR~

    # this creates a single tibble 12 columns wide
    get_concept_list(df) %>% 
      map_dfc(~ mutate(df, {{.x}} := toupper(.x)))
    #> # A tibble: 1 x 12
    #>   dataset_title dataset_id ..1   dataset_title1 dataset_id1 ..11  dataset_title2
    #>   <chr>         <chr>      <chr> <chr>          <chr>       <chr> <chr>         
    #> 1 Population e~ NM_2002_1  TIME  Population es~ NM_2002_1   GEND~ Population es~
    #> # ... with 5 more variables: dataset_id2 <chr>, ..12 <chr>,
    #> #   dataset_title3 <chr>, dataset_id3 <chr>, ..13 <chr>

    # function to get info on each concept (except geography) -----------------
    # this is the function I want to use eventually to populate my new columns

    get_concept_info <- function(df, concept_name) {
      dataset_id <- pluck(df, "dataset_id")
      nomis_overview(id = dataset_id) %>%
        filter(name == "dimensions") %>%
        pluck("value", 1, "dimension") %>%
        filter(concept == concept_name) %>%
        pluck("codes.code", 1) %>%
        select(name, value) %>%
        nest(data = everything()) %>%
        as.list() %>%
        pluck("data")
    }


    # individual mutate works, for comparison ---------------------------------
    # I can create the kind of table I want manually using a line like the one below

    # df %>% map(~ mutate(., measures = get_concept_info(., concept_name = "measures")))
    df %>% mutate(., measures = get_concept_info(df, "measures"))
    #> # A tibble: 1 x 3
    #>   dataset_title                                        dataset_id measures      
    #>   <chr>                                                <chr>      <list>        
    #> 1 Population estimates - local authority based by sin~ NM_2002_1  <tibble [2 x ~

<sup>Created on 2020-02-10 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>
尤金C

使用!!:=使您可以动态命名列。然后,我们可以减少map()with的列表输出reduce(),即使用数据集标题和id列left_joins()列表中的所有数据框。

df_2 <- 
  map(get_concept_list(df),
      ~ mutate(df,
               !!.x := get_concept_info(df, .x))) %>% 
  reduce(left_join, by = c("dataset_title", "dataset_id"))

df_2

# A tibble: 1 x 6
  dataset_title                                               dataset_id           time         gender          c_age       measures
  <chr>                                                       <chr>      <list<df[,2]>> <list<df[,2]>> <list<df[,2]>> <list<df[,2]>>
1 Population estimates - local authority based by single year NM_2002_1        [28 x 2]        [3 x 2]      [121 x 2]        [2 x 2]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将一组 JSON 对象转换为 C# 列表

来自分类Dev

如何将一组坐标转换为Char?

来自分类Dev

Python:如何将一组包含逗号(表示为列表元素)的字符串转换为子列表?

来自分类Dev

如何将行转换为列标题和其他列的值作为数据?

来自分类Dev

如何将一列的值转换为列标题,而其他列的值转换为行?

来自分类Dev

如何将 List<'a> 转换为其他对象列表?

来自分类Dev

使用其他列类型将两列数据转换为一个col

来自分类Dev

如何将文本框中的文本转换为零和一,如何将两列的内容拆分为许多其他列

来自分类Dev

如何使用R将包含一列相同值但其他列不同的行转换为单个行?

来自分类Dev

如何在其他列中为一组值创建索引列

来自分类Dev

如何从一组列表中向下滑动一个列表并单击关闭其他列表?

来自分类Dev

如何将构成凸包的半空间转换为一组极限点?

来自分类Dev

如何将数据框行转换为一组对?

来自分类Dev

如何将多张Excel文件转换为一组CSV文件?

来自分类Dev

如何将一组要素转换为熊猫中的计数矩阵

来自分类Dev

C# 如何将一组整数变量转换为字节数组?

来自分类Dev

如何将一组 powershell 命令转换为可以在需要时运行的脚本?

来自分类Dev

如何在Impala中填充一列以区分一组行与组中其他行?

来自分类Dev

使用其他字体的一组字符创建ttf

来自分类Dev

使用其他字体的一组字符创建ttf

来自分类Dev

PDF:如何将一列列表转换为多列数据框?-组内子组中的人员列表到多列

来自分类Dev

如何使用PHPExcel冻结标题和一组列

来自分类Dev

使用map和concat将列表推导转换为定义

来自分类Dev

如何将其转换为一组线性约束?

来自分类Dev

如何避免列表视图上的一组隐藏元素随机出现在其他行上?

来自分类Dev

需要使用Linq将列表转换为其他列表的帮助

来自分类Dev

使用第一个 List 中的一些键将 List<Map> 转换为其他 List<Map>,以及整个第一个列表

来自分类Dev

如何根据一列的唯一值将其他列的行转换为列?

来自分类Dev

如何检索按其他对象的字段过滤和排序的一组对象,而所需对象是外键?

Related 相关文章

  1. 1

    如何将一组 JSON 对象转换为 C# 列表

  2. 2

    如何将一组坐标转换为Char?

  3. 3

    Python:如何将一组包含逗号(表示为列表元素)的字符串转换为子列表?

  4. 4

    如何将行转换为列标题和其他列的值作为数据?

  5. 5

    如何将一列的值转换为列标题,而其他列的值转换为行?

  6. 6

    如何将 List<'a> 转换为其他对象列表?

  7. 7

    使用其他列类型将两列数据转换为一个col

  8. 8

    如何将文本框中的文本转换为零和一,如何将两列的内容拆分为许多其他列

  9. 9

    如何使用R将包含一列相同值但其他列不同的行转换为单个行?

  10. 10

    如何在其他列中为一组值创建索引列

  11. 11

    如何从一组列表中向下滑动一个列表并单击关闭其他列表?

  12. 12

    如何将构成凸包的半空间转换为一组极限点?

  13. 13

    如何将数据框行转换为一组对?

  14. 14

    如何将多张Excel文件转换为一组CSV文件?

  15. 15

    如何将一组要素转换为熊猫中的计数矩阵

  16. 16

    C# 如何将一组整数变量转换为字节数组?

  17. 17

    如何将一组 powershell 命令转换为可以在需要时运行的脚本?

  18. 18

    如何在Impala中填充一列以区分一组行与组中其他行?

  19. 19

    使用其他字体的一组字符创建ttf

  20. 20

    使用其他字体的一组字符创建ttf

  21. 21

    PDF:如何将一列列表转换为多列数据框?-组内子组中的人员列表到多列

  22. 22

    如何使用PHPExcel冻结标题和一组列

  23. 23

    使用map和concat将列表推导转换为定义

  24. 24

    如何将其转换为一组线性约束?

  25. 25

    如何避免列表视图上的一组隐藏元素随机出现在其他行上?

  26. 26

    需要使用Linq将列表转换为其他列表的帮助

  27. 27

    使用第一个 List 中的一些键将 List<Map> 转换为其他 List<Map>,以及整个第一个列表

  28. 28

    如何根据一列的唯一值将其他列的行转换为列?

  29. 29

    如何检索按其他对象的字段过滤和排序的一组对象,而所需对象是外键?

热门标签

归档