我正在使用 foomap2 修改 mutate 内的嵌套数据框,我想根据 foo$name 在每个嵌套数据框中命名一个变量。我不确定 nse/tidyeval 取消引用的正确语法是什么。
我的尝试:

library(tidyverse)

foo <- mtcars %>%
  group_by(gear) %>%
  nest %>%
  mutate(name = c("one", "two", "three")) %>%
  mutate(data = map2(data, name, ~
                       mutate(.x, !!(.y) := "anything")))
#> Error in quos(...): object '.y' not found

我希望嵌套数据框中的新创建变量的名称分别为“一个”,“两个”和“三个”。

如果我在普通的 mutate 上执行普通的 df 并且其中 name 是一个字符串,我的尝试基于我会使用的普通语法:

name <- "test"
mtcars %>% mutate(!!name := "anything") # works fine

如果成功,以下行应返回 TRUE :

foo[1,2] %>% unnest %>% names %>% .[11] == "one"

最佳答案

这似乎是!!mutatemap的工作方式的功能/错误(不确定,请参见下面的GitHub链接问题)。解决方案是定义一个自定义函数,在这种情况下,取消引用可以按预期工作。

library(tidyverse)

custom_mutate <- function(df, name, string = "anything")
    mutate(df, !!name := string)

foo <- mtcars %>%
  group_by(gear) %>%
  nest %>%
  mutate(name = c("one", "two", "three")) %>%
  mutate(data = map2(data, name, ~
      custom_mutate(.x, .y)))

foo[1,2] %>% unnest %>% names %>% .[11] == "one"
#[1] TRUE

您可以在GitHub的问题#541中找到更多详细信息:map2() call in dplyr::mutate() error while standalone map2() call works;请注意,该问题已于2018年9月关闭,因此我假设这是预期的行为。

一种替代方法是使用group_split而不是nest,在这种情况下,我们
避免取消报价问题
nms <- c("one", "two", "three")

mtcars %>%
    group_split(gear) %>%
    map2(nms, ~.x %>% mutate(!!.y := "anything"))

关于r - 如何在 `map` 内部取消引用 (!!) `mutate`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55605175/

10-09 17:07