繁体   English   中英

使用.id使带有purrr :: map_df的输入项列不复制命名向量的输入

Make column of input items with purrr::map_df using .id without duplicating inputs for named vector

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我经常想在数据框中映射列名称的向量,并使用.id参数跟踪输出。 但是将与每个map迭代相关的列名称写入该.id列似乎需要将其名称在输入向量中加倍-换句话说,通过为每个列名称命名使用其自己的名称。 如果我不使用自己的名称来命名列,则.id仅存储迭代的索引。

根据purrr :: map docs ,这是预期的行为:

。ID
字符串或NULL。 如果是字符串,则输出将包含具有该名称的变量,该变量存储输入的名称(如果已命名.x)或索引(如果未命名.x)。

但是我的方法有点笨拙,所以我想我缺少了一些东西。 有没有更好的方法来获取要迭代的列的列表,而又不需要在输入向量中每次写两次列名? 我们欢迎所有的建议!

这是一个使用示例:

library(rlang)
library(tidyverse)

tb <- tibble(foo = rnorm(10), bar = rnorm(10))

cols_once <- c("foo", "bar")
cols_once %>% map_dfr(~ tb %>% summarise(avg = mean(!!sym(.x))), .id="var")
# A tibble: 2 x 2
  var       avg   <-- var stores only the iteration index
  <chr>   <dbl>
1 1     -0.0519
2 2      0.204 

cols_twice <- c("foo" = "foo", "bar" = "bar")
cols_twice %>% map_dfr(~ tb %>% summarise(avg = mean(!!sym(.x))), .id="var")
# A tibble: 2 x 2
  var       avg   <-- var stores the column names
  <chr>   <dbl>
1 foo   -0.0519
2 bar    0.204 
2 个回复

这是使用summarize_atgather特定方案的替代解决方案:

tb %>% summarize_at( cols_once, mean ) %>% gather( var, avg )
# # A tibble: 2 x 2
#   var      avg
#   <chr>  <dbl>
# 1 foo   0.374 
# 2 bar   0.0397

在更普遍的情况下,我不认为有各地的命名方式cols_once与工作时map_dfr因为你在你的问题中指出预期的行为。 但是,您可以使用setNames()的“ snake case”包装器来做得更优雅:

cols_once %>% set_names %>% 
  map_dfr(~ tb %>% summarise(avg = mean(!!sym(.x))), .id="var")
# # A tibble: 2 x 2
#   var      avg
#   <chr>  <dbl>
# 1 foo   0.374 
# 2 bar   0.0397

您可以使用以下方法轻松创建输入向量:

setNames(names(tb), names(tb))

因此您的代码将是:

setNames(names(tb), names(tb)) %>%
  map_dfr(~ tb %>% summarise(avg = mean(!!sym(.x))), .id="var")

根据您的评论进行编辑:

仍然不是您想要的解决方案,但是当您不使用所有列名时,仍可以使用setNames()并将所需的子集作为子集(或将不需要的子集作为子集)。

tb <- tibble(foo = rnorm(10), bar = rnorm(10), taz = rnorm(10))

setNames(names(tb), names(tb))[-3]
1 如何在purrr :: map_df之后使用映射向量添加列

我使用mtcars数据集作为例子来说明我的问题。 我对每个柱面类型进行了线性回归,并使用map_df将所有模型结果放在一起。 (下面的代码和输出)。 我想要做的是添加另一个名为'cylinder'的列(4,4,6,6,8,8)。 我怎么能在map_df中做到这一点? 当我添加参数.id ...

2 在因子列上使用来自 purrr 的 map_df

我正在尝试计算多列中所有属于Paper列中四个因素之一的行的响应数。 我可以使用 purr 中的 map_df 分别对每个因素的项求和 但是当我尝试这样做而不只选择一列时: 我收到错误Error: Argument 9 must be length 4, not 5这是对最后一列因素的引用。 ...

3 purrr map_df 输出一个新的嵌套数据框列

有没有办法添加一个额外的嵌套列,其中包含来自函数的新数据帧输出? 下面是一个示例,其中我编写了一个函数,现在我正在尝试遍历每一行。 这是函数,如果我在一组数据上运行它,它就可以工作。 (见 a、b、c、d) 功能 这是我想迭代的嵌套数据框。 我最初的尝试是使用 PURR map_df, ...

4 bind_rows_(x,.id)出错:参数1必须在purrr中使用map_df

我正在使用spotifyr包来抓取我的数据集中特定专辑的每首歌曲的音频功能。 我的问题是我的数据集包含一些不在spotify上的艺术家 - 所以他们不应该返回任何值。 我的问题是,当我找到一个不在spotify上的艺术家时,我收到了这个错误: 我已经尝试在tryCatch中包装函 ...

5 使用 purrr::map_df 在函数中转发参数

我正在尝试创建一个函数,该函数使用readxl::read_excel读取 excel 工作簿中的所有工作readxl::read_excel并将它们绑定到单个数据框中,并允许我将附加参数传递给read_excel 。 我可以做第一部分,但不能做第二部分。 我应该返回一个文件,而不是我收到一个错 ...

6 等价于purrr :: map_df中的next

我正在寻找相当于purrr :: map_df调用的next in循环。 map_df可以很好地处理NULL数据帧(如下面的示例所示),因此当我在下面的示例中将Result &lt;- NULL -NULL设置为时,它将起作用。 任何人都可以为下面的插图提出一个通用的解决方案,该解决 ...

7 Purrr :: map_df()删除NULL行

当使用purrr::map_df() ,我偶尔会传递一些项为NULL的数据帧列表。 当我这样做时, map_df()返回的数据帧的行数少于原始列表的行数。 我假设正在发生的事情是map_df()调用了dplyr::bind_rows() ,它忽略了NULL值。 但是,我不确定如何识别有 ...

10 带有嵌套data.frame的purrr :: map_df

我想遍历一系列数据框,并将相同的功能应用于所有这些数据框。 我正在尝试使用tidyr::nest和purrr::map_df 。 这是我要实现的目标的一个代表。 我究竟做错了什么? 有其他方法吗? 编辑:澄清我想要的输出。 瞄准包含输出的新列,例如 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM