При снятии кавычек не удается найти переменную в mutate и map2 при переименовании столбца данных во вложенном тибле R

Хорошо, я просто пытаюсь переименовать столбец внутри вложенного тиббла на основе столбца идентификатора / символа:

MWE:

library(magrittr)
iris %>% 
  tibble::as_tibble() %>%
  tidyr::nest(-Species) %>%
  dplyr::mutate(
    Species = as.character(Species),
    data = purrr::map2(data, Species,
                       ~dplyr::rename(.x, !!.y := Sepal.Width)))

но это возвращает ошибку:

Error in quos(..., .named = TRUE) : object '.y' not found

Я безуспешно пытался использовать ensym из rlang и всевозможные комбинации !! и :=. То есть первый тиббл в столбце данных должен иметь столбец Sepal.Width, переименованный в setosa, второй - в versicolor, а для последнего тиббла Sepal.Widht следует переименовать в virginica.


person Baraliuh    schedule 09.03.2019    source источник
comment
Просто удалите двоеточие .y = Sepal.Width?   -  person Rui Barradas    schedule 09.03.2019
comment
Нет, с тех пор столбец будет называться буквально .y.   -  person Baraliuh    schedule 09.03.2019
comment
Хорошо, извините за ненужный шум.   -  person Rui Barradas    schedule 09.03.2019
comment
На самом деле это дает мне следующую ошибку: Error: unexpected '=' in: " data = purrr::map2(data, Species, ~dplyr::rename(.x, !!.y =" Если я также не удалю !!   -  person Baraliuh    schedule 09.03.2019


Ответы (2)


Вы можете отказаться от обозначения формулы:

library(magrittr)
irisNest <- iris %>%
  tibble::as_tibble() %>%
  tidyr::nest(-Species) %>%
  dplyr::mutate(Species = as.character(Species))

f <- function(x,y) {dplyr::rename(x, !!y := Sepal.Width)}

irisCheck <- dplyr::mutate(irisNest,
              data = purrr::map2(data, Species, f))
person RolandASc    schedule 09.03.2019

library("tidyverse")

rename_func <- function(data, Species) {
  Species <- as.character(Species)
  data %>%
    rename(!!Species := Sepal.Length)
}

iris2 <- as_tibble(iris) %>%
  nest(-Species) %>%
  group_by(Species) %>%
  mutate(
    data = map2(data, Species, rename_func))

iris2 %>% filter(Species == "setosa") %>% unnest() %>% head(1)
#> # A tibble: 1 x 5
#> # Groups:   Species [3]
#>   Species setosa Sepal.Width Petal.Length Petal.Width
#>   <fct>    <dbl>       <dbl>        <dbl>       <dbl>
#> 1 setosa     5.1         3.5          1.4         0.2
iris2 %>% filter(Species == "versicolor") %>% unnest() %>% head(1)
#> # A tibble: 1 x 5
#> # Groups:   Species [3]
#>   Species    versicolor Sepal.Width Petal.Length Petal.Width
#>   <fct>           <dbl>       <dbl>        <dbl>       <dbl>
#> 1 versicolor          7         3.2          4.7         1.4
iris2 %>% filter(Species == "virginica") %>% unnest() %>% head(1)
#> # A tibble: 1 x 5
#> # Groups:   Species [3]
#>   Species   virginica Sepal.Width Petal.Length Petal.Width
#>   <fct>         <dbl>       <dbl>        <dbl>       <dbl>
#> 1 virginica       6.3         3.3            6         2.5

Создано 10 марта 2019 г. пакетом REPEX (v0.2.1)

person dipetkov    schedule 09.03.2019
comment
Это неправильно называет столбцы. - person Baraliuh; 10.03.2019
comment
На самом деле непонятно, какой столбец вы имеете в виду и какое имя хотите дать ему. - person dipetkov; 10.03.2019
comment
На самом деле это так. Названия должны соответствовать индексу в столбце видов, - person Baraliuh; 10.03.2019
comment
!! := - это обозначения rlang для именования столбцов, основанные на символах. То есть, если .y - это переменная с символом, столбец будет назван в соответствии с этим символом. - person Baraliuh; 10.03.2019