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

2024-01-16

我已经尝试过这段代码的数百种排列字面上的天尝试获得一个可以完成我想要的功能,但我最终放弃了。感觉这绝对是可行的,而且我已经很接近了!

我试图通过下面的代表回到这里的核心问题。

基本上我有一个单行数据框,其中一列包含字符串列表(“概念”)。我想为每个字符串创建一个附加列,使用mutate,理想情况下列从字符串中获取其名称,然后用函数调用的结果填充列(?现在哪个函数并不重要? - 我只需要函数的基础设施才能工作。 )

像往常一样,我觉得我一定错过了一些明显的东西......也许只是一个语法错误。 我也想知道是否需要使用purrr::map,也许更简单的矢量化映射会很好地工作。

我觉得新的专栏被命名了..1而不是概念名称,而是关于问题所在的一点线索。

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

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

  • 如何使用 purrr 中的映射和 dplyr::mutate 基于列对创建多个新列 https://stackoverflow.com/questions/49816669/how-to-use-map-from-purrr-with-dplyrmutate-to-create-multiple-new-columns-base
  • 如何使用 purrr:map 函数使用动态变量改变多列? https://stackoverflow.com/questions/57183024/how-to-mutate-multiple-columns-with-dynamic-variable-using-purrrmap-function
  • (R) 将 map() 与列表列一起使用的更简洁方法 https://stackoverflow.com/questions/53938745/r-cleaner-way-to-use-map-with-list-columns
  • 使用 purrr 和预定义函数添加多个输出变量 https://stackoverflow.com/questions/51978138/add-multiple-output-variables-using-purrr-and-a-predefined-function
  • 使用 purrr 创建新变量(如何做到这一点?) https://stackoverflow.com/questions/52607511/creating-new-variables-with-purrr-how-does-one-go-about-that
  • 如何使用动态名称计算 R 数据框中的多个新列 https://stackoverflow.com/questions/58641327/how-to-compute-multiple-new-columns-in-a-r-dataframe-with-dynamic-names

但这些都没有完全帮助我解决我遇到的问题。 [edit:在最后一个 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>

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

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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 map* 和 mutate 将列表转换为一组附加列? 的相关文章

  • 如何获得 STAN 中最大似然估计的标准误差?

    我在 Stan 中使用最大似然优化 但不幸的是optimizing 函数不报告标准错误 gt MLb4c lt optimizing get stanmodel fitb4c data win data init inits STAN OP
  • 将循环转换为并行计算的函数

    我正在使用 R 编程语言 我遇到这个问题 我试图找出两个 shapefile 之间的成对交集 即第一个 shapefile 中的每个多边形与第二个 shapefile 中的所有多边形相交的百分比 我想我找到了解决这个问题的基本方法 Load
  • 使用 R Shiny 从 XLConnect 下载 Excel 文件

    有没有人尝试过使用 R Shiny 中的下载处理程序通过 XLConnect 下载新创建的 Excel 文件 在 ui R 中有一行不起眼的行 downloadButton downloadData Download 在 server R
  • 如何提取与 R 中主题 ID 列表匹配的行?

    我有一个包含许多主题 ID 的数据框 每个主题都有重复观察 我还有一个单独的数据框 其中只有一个主题 ID 列表 我想从更大的数据框中匹配和提取 如何以允许我引用不同数据帧中的SubjectID列表的方式编写代码 不确定我是否完全理解这个问
  • R 根据事件更新值

    我最近发布了这个问题 该问题已经与我在笔记本电脑上本地使用的 Mysql 数据库相关 由于我在 Mysql 中没有找到问题的解决方案 其他人似乎也没有找到解决方案 所以我想再次发布它 但现在与 R 相关 我使用带有 RMysql 包的数据库
  • 基于服务器中的条件逻辑呈现闪亮的用户输入

    我正在尝试设置一个闪亮的导航栏面板页面 其中用户控制我根据一组单选按钮中所做的初始选择来显示更改 我直接在 ui 中渲染单选按钮 然后在 Server r 中的 观察到的 逻辑控制结构内构建条件控件 弹出错误是因为我的初始 if 语句计算结
  • 删除ggplot2中的负图区域[重复]

    这个问题在这里已经有答案了 如何删除 ggplot2 中 x 轴和 y 轴下方的绘图区域 请参见下面的示例 我尝试了几个主题元素 panel border panel margin plot margin 但没有任何运气 p lt ggpl
  • 在shiny中过滤传单地图数据

    我在用传单地图设置这个闪亮的东西时遇到了麻烦 我的原帖 https stackoverflow com questions 50111566 applying leaflet map bounds to filter data within
  • R - Plm 和 lm - 固定效应

    我有一个平衡面板数据集 df 本质上由三个变量组成 A B and Y 对于一堆独特识别的区域来说 它会随着时间的推移而变化 我想运行一个回归 其中包括区域 下面等式中的区域 和时间 年份 固定效应 如果我没记错的话 我可以通过不同的方式来
  • 纵向序列数据的三次样条方法?

    我有一个串行数据 格式如下 time milk Animal ID 30 25 6 1 31 27 2 1 32 24 4 1 33 17 4 1 34 33 6 1 35 25 4 1 33 29 4 2 34 25 4 2 35 24
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • 如何使用 usmap 标记数字而不是名称?

    我知道 usmap 有一个选项label in plot usmap 我想标记一些数字 而不是状态名称 我想 usmap 中应该有与州质心坐标相关的数据 但我不知道如何找到它 如果我能得到 坐标然后我可以用它来标记数字geom text 这
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • 尝试读取 CSV 文件时出现“无法识别的字符串转义”

    我正在尝试导入一个 csv文件 以便我可以观看此视频 R ggplot2 图形直方图 http www youtube com watch v 47kWynt3b6M 我安装了所有正确的软件包 包括ggplot以及相关的包 视频中的第一个说
  • twitterR 和 ROAuth R 软件包安装

    我在安装 CRAN 上的 twitteR 和 RAOuth 软件包时遇到一些问题 我尝试了几种不同的方法 在 Windows 下使用源代码 在 Ubuntu 下使用 RStudio 我尝试了以下命令 sudo apt get install
  • 使用 R 选择第一个非 NA 值

    df lt data frame ID c 1 1 1 2 3 3 3 test c NA 5 5 6 4 NA 7 3 NA 10 9 我想创建一个名为 value 的变量 它是每个单独 ID 测试的第一个非 NA 值 对于只有NA的个体
  • 只读取选定的列

    谁能告诉我如何仅读取下面每年数据的前 6 个月 7 列 例如使用read table Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2009 41 27 25 31 31 39 2
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 更改闪亮 R 中的默认浏览器

    我在 RStudio 中使用 01 hello 虽然在 IE 中默认打开程序时它不会显示直方图 但即使在 Chrome 中 滑块也不起作用 我无法滑动条形图并看到直方图中的变化 如何更改 R 中的默认浏览器 以便闪亮启动 Chrome 而不
  • 在 r 中的 group_by 之后建模后取消列表列的嵌套

    我想对所有组进行线性回归group by 将模型系数保存在列表列中 然后使用 unnest 扩展列表列 这里我用的是mtcars以数据集为例 注 我想用do here becausebroom tidy 不适用于所有型号 mtcars gt

随机推荐

  • Delphi/Pascal 有静态代码分析工具吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Delphi Pascal 有静态代码分析工具吗 我见过很多 C 和 NET 的选项 但没有看到 De
  • java中如何将字符串转换为比特流

    如何将字符串转换为位 0 和 1 的流 我做了什么我采取了一个字符串 然后将其转换为一个字符数组 然后我使用了方法 称为 forDigit char int 但它没有给我作为 0 和 1 流的字符 你能帮忙吗 另外我怎样才能从位到字符进行相
  • 如何使用selenium获取td元素的文本?

    我有一个 html 表格 我需要用硒获取 td 元素的文本 html结构 table tbody tr td b Success b You have transferred 1 000 00 USD to DIST2 Your balan
  • 从 iPhone 发送 UDP 数据包

    有人有关于从 iPhone SDK 发送 UDP 数据包的好教程吗 EDIT 事实上 做到这一点真的很容易 RTFM 包含 AsyncUdpSocket 后 只需在标头中添加以下内容 AsyncUdpSocket socket 主要是 NS
  • Python Rich 表中的列表列表

    鉴于以下内容 我怎样才能将动物 年龄和性别放入每个表格单元格中 目前 所有数据最终都存储在一个单元格中 谢谢 from rich console import Console from rich table import Table lis
  • Appium Send keys() 函数发送中文字符作为英文字符串的一部分

    使用appium时send keys 函数在文本字段中发送名称 除了名称之外 文本字段中还会出现一些随机的汉字 我们在能力中使用 capabilities setCapability unicodeKeyboard true 甚至认为我们无
  • 基于行中的值的“开始”和“结束”日期

    我有一个可以找到的输入数据示例here https github com veronique ka tests blob master input xlsx input 我需要根据每行中的数据添加两列 开始日期 和 结束日期 开始日期 当所
  • 无法从 PATH 环境变量中删除 cygwin

    我最近不得不重新安装 Cygwin 在这样做时 我遇到了某些应用程序的问题 因为 Cygwin 似乎已附加到我的 PATH 环境变量中 我尝试按照这些说明删除它https www java com en download help path
  • 如何使用 SSMS 中的表值参数执行存储过程

    当我右键单击存储过程并选择执行存储过程命令时 我应该将什么作为值传递给表值参数 我不是在谈论 SSMS 查询 窗口 我说的是当您右键单击 SP 时显示的 执行过程 对话框 我可以通过此屏幕直接向 SP 提供参数值吗 这是可以做到的 例如 假
  • 如何在 Ruby 中将字符串转换为常量?

    如何转换字符串 User to User Object const get User 无需 ActiveSupport
  • PyGTK中动态修改/刷新菜单内容

    我正在尝试在我用 PyGTK 编写的 GUI 的菜单中实现最近打开的项目列表 我像这样初始化菜单 self filemenu gtk Menu self init file menu self fileitem gtk MenuItem F
  • 在多项活动中使用 Espresso 空闲资源

    我有一个启动第二个活动的第一个活动 在第二个活动中我有一个加载对话框 不是 AsyncTask 我需要让 Espresso 等到对话框消失后再继续测试 我必须在哪里实现 IdlingResource 我怎样才能让它等待dismissDial
  • 将向量作为 void 指针传递给函数

    我有一个回调函数 需要一个void 作为传递参数的参数 我想将向量传递给函数 该函数将被多次调用 因此在回调过程完成后 我希望能够迭代所有已调用的元素push back 通过回调 static void cb void data vecto
  • Angular 应用程序中 Font Awesome 字体出现 CORS 错误

    我已经运行 Angular 和 Material 一段时间了 但是这个问题突然出现并让我难住了 我正在运行来自 IntelliJ 的 Angular 应用程序 它开始出现在我的控制台中 访问位于 的字体https fonts gstatic
  • .NET 将外部 CSS 转换为内联 CSS [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个将外部 CSS 转换为内联 CSS 的工具 生成的 HTML 用于电子邮件和 PDF 创
  • 使用 SwiftUI 制作按钮闪烁动画

    如何在 SwiftUI 中制作边框颜色变化动画 这是 UIKit 的代码 extension UIButton func blink setColor UIColor repeatCount Float duration Double se
  • Android 单元测试没有被嘲笑

    我跟着本指南 https sites google com a android com tools tech docs unit testing support但我遇到了这个错误 junit framework AssertionFaile
  • 将鼠标监听器添加到 JTextPane 中插入的 JLabel/JButton

    我遇到一个问题 当我尝试将鼠标侦听器添加到 JTextPane 中的 JLabel 或 JButton 时 出现错误 无法通过调用转换转换为鼠标侦听器 我更愿意将该组件放在 JEditorPane 中 我还听说可以使用 HyperlinkE
  • 如果我故意标记一个函数[我知道可能会抛出] noexcept 以在发生异常时立即终止,我的代码是否格式不正确? [复制]

    这个问题在这里已经有答案了 我知道 标记一个函数noexcept 在某些情况下 可能有助于获得许多很棒的优化 例如移动语义 但是假设 我的代码中有一个函数执行非常关键的操作 如果该函数失败 则意味着发生了非常糟糕的事情以至于无法恢复 并且该
  • 如何使用 map* 和 mutate 将列表转换为一组附加列?

    我已经尝试过这段代码的数百种排列字面上的天尝试获得一个可以完成我想要的功能 但我最终放弃了 感觉这绝对是可行的 而且我已经很接近了 我试图通过下面的代表回到这里的核心问题 基本上我有一个单行数据框 其中一列包含字符串列表 概念 我想为每个字