Почему dplyr :: mutate_at () для первого элемента в построчном тибле также влияет на остальные элементы? - PullRequest
0 голосов
/ 19 июня 2020

В следующем коде я определил тиббл df с двумя столбцами: name столбец содержит вектор символов c("a", "b", "c"), а data столбец содержит список тибблей, каждый со столбцом value . Затем я бы хотел изменить имя столбца каждого столбца value тиббла на символ в соответствующей строке, например, «a», «b» и «c». Чтобы управлять тиблом построчно, я использовал dplyr::rowwise(), но затем я обнаружил, что изменения, вступающие в силу для первого элемента (изменение имени столбца на «a»), также влияют на остальные элементы ( поскольку после первой строки напечатанный тибет перед изменением имени столбца показывал имя столбца «a»). И поэтому можно ожидать, что изменение имен столбцов для следующих элементов в столбце не удалось, поскольку больше не было имен столбцов со значением «значение» (все изменилось на «а»). Должен ли я использовать здесь функцию purrr::map() вместо более аккуратных построчных манипуляций с таблицей?

Не могли бы вы дать мне ответ, используя метод rowwise - mutate_at? Спасибо.

library(tidyverse)
#> Warning: 程辑包'tidyverse'是用R版本3.6.3 来建造的
#> Warning: 程辑包'ggplot2'是用R版本3.6.1 来建造的
#> Warning: 程辑包'tibble'是用R版本3.6.3 来建造的
#> Warning: 程辑包'tidyr'是用R版本3.6.1 来建造的
#> Warning: 程辑包'readr'是用R版本3.6.1 来建造的
#> Warning: 程辑包'purrr'是用R版本3.6.1 来建造的
#> Warning: 程辑包'dplyr'是用R版本3.6.3 来建造的
#> Warning: 程辑包'stringr'是用R版本3.6.1 来建造的
#> Warning: 程辑包'forcats'是用R版本3.6.3 来建造的

df <- tibble::tibble(name = c("a", "b", "c"),
                     data = list(tibble::tibble(value = 1:10)))

df_mutate <- df %>%
  dplyr::rowwise() %>%
  dplyr::mutate_at("data", ~ {
    print(.x)
    colnames(.x)[colnames(.x) %in% "value"] <- name
    list(.x)
  }) %>%
  dplyr::ungroup()
#> # A tibble: 10 x 1
#>    value
#>    <int>
#>  1     1
#>  2     2
#>  3     3
#>  4     4
#>  5     5
#>  6     6
#>  7     7
#>  8     8
#>  9     9
#> 10    10
#> # A tibble: 10 x 1
#>        a
#>    <int>
#>  1     1
#>  2     2
#>  3     3
#>  4     4
#>  5     5
#>  6     6
#>  7     7
#>  8     8
#>  9     9
#> 10    10
#> # A tibble: 10 x 1
#>        a
#>    <int>
#>  1     1
#>  2     2
#>  3     3
#>  4     4
#>  5     5
#>  6     6
#>  7     7
#>  8     8
#>  9     9
#> 10    10

Создано 2020-06-19 пакетом REPEX (v0.3.0)

devtools::session_info()
#> - Session info ---------------------------------------------------------------
#>  setting  value                         
#>  version  R version 3.6.0 (2019-04-26)  
#>  os       Windows Server x64            
#>  system   x86_64, mingw32               
#>  ui       RTerm                         
#>  language (EN)                          
#>  collate  Chinese (Simplified)_China.936
#>  ctype    Chinese (Simplified)_China.936
#>  tz       Asia/Taipei                   
#>  date     2020-06-19                    
#> 
#> - Packages -------------------------------------------------------------------
#>  package     * version date       lib source        
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 3.6.1)
#>  backports     1.1.5   2019-10-02 [1] CRAN (R 3.6.1)
#>  broom         0.5.6   2020-04-20 [1] CRAN (R 3.6.3)
#>  callr         3.4.0   2019-12-09 [1] CRAN (R 3.6.2)
#>  cellranger    1.1.0   2016-07-27 [1] CRAN (R 3.6.1)
#>  cli           2.0.2   2020-02-28 [1] CRAN (R 3.6.3)
#>  colorspace    1.4-1   2019-03-18 [1] CRAN (R 3.6.1)
#>  crayon        1.3.4   2017-09-16 [1] CRAN (R 3.6.1)
#>  DBI           1.1.0   2019-12-15 [1] CRAN (R 3.6.2)
#>  dbplyr        1.4.2   2019-06-17 [1] CRAN (R 3.6.3)
#>  desc          1.2.0   2018-05-01 [1] CRAN (R 3.6.1)
#>  devtools      2.2.1   2019-09-24 [1] CRAN (R 3.6.1)
#>  digest        0.6.23  2019-11-23 [1] CRAN (R 3.6.2)
#>  dplyr       * 1.0.0   2020-05-29 [1] CRAN (R 3.6.3)
#>  ellipsis      0.3.0   2019-09-20 [1] CRAN (R 3.6.1)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 3.6.1)
#>  fansi         0.4.0   2018-10-05 [1] CRAN (R 3.6.1)
#>  forcats     * 0.5.0   2020-03-01 [1] CRAN (R 3.6.3)
#>  fs            1.3.1   2019-05-06 [1] CRAN (R 3.6.1)
#>  generics      0.0.2   2018-11-29 [1] CRAN (R 3.6.1)
#>  ggplot2     * 3.2.1   2019-08-10 [1] CRAN (R 3.6.1)
#>  glue          1.4.1   2020-05-13 [1] CRAN (R 3.6.3)
#>  gtable        0.3.0   2019-03-25 [1] CRAN (R 3.6.1)
#>  haven         2.2.0   2019-11-08 [1] CRAN (R 3.6.3)
#>  highr         0.8     2019-03-20 [1] CRAN (R 3.6.1)
#>  hms           0.5.2   2019-10-30 [1] CRAN (R 3.6.2)
#>  htmltools     0.4.0   2019-10-04 [1] CRAN (R 3.6.1)
#>  httr          1.4.1   2019-08-05 [1] CRAN (R 3.6.1)
#>  jsonlite      1.6     2018-12-07 [1] CRAN (R 3.6.1)
#>  knitr         1.26    2019-11-12 [1] CRAN (R 3.6.2)
#>  lattice       0.20-38 2018-11-04 [2] CRAN (R 3.6.0)
#>  lazyeval      0.2.2   2019-03-15 [1] CRAN (R 3.6.1)
#>  lifecycle     0.2.0   2020-03-06 [1] CRAN (R 3.6.3)
#>  lubridate     1.7.4   2018-04-11 [1] CRAN (R 3.6.2)
#>  magrittr      1.5     2014-11-22 [1] CRAN (R 3.6.1)
#>  memoise       1.1.0   2017-04-21 [1] CRAN (R 3.6.1)
#>  modelr        0.1.6   2020-02-22 [1] CRAN (R 3.6.3)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 3.6.1)
#>  nlme          3.1-143 2019-12-10 [1] CRAN (R 3.6.2)
#>  pillar        1.4.3   2019-12-20 [1] CRAN (R 3.6.2)
#>  pkgbuild      1.0.6   2019-10-09 [1] CRAN (R 3.6.0)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 3.6.0)
#>  pkgload       1.0.2   2018-10-29 [1] CRAN (R 3.6.1)
#>  prettyunits   1.0.2   2015-07-13 [1] CRAN (R 3.6.1)
#>  processx      3.4.1   2019-07-18 [1] CRAN (R 3.6.1)
#>  ps            1.3.0   2018-12-21 [1] CRAN (R 3.6.1)
#>  purrr       * 0.3.3   2019-10-18 [1] CRAN (R 3.6.1)
#>  R6            2.4.1   2019-11-12 [1] CRAN (R 3.6.2)
#>  Rcpp          1.0.3   2019-11-08 [1] CRAN (R 3.6.2)
#>  readr       * 1.3.1   2018-12-21 [1] CRAN (R 3.6.1)
#>  readxl        1.3.1   2019-03-13 [1] CRAN (R 3.6.1)
#>  remotes       2.1.0   2019-06-24 [1] CRAN (R 3.6.1)
#>  reprex        0.3.0   2019-05-16 [1] CRAN (R 3.6.3)
#>  rlang         0.4.6   2020-05-02 [1] CRAN (R 3.6.3)
#>  rmarkdown     2.0     2019-12-12 [1] CRAN (R 3.6.2)
#>  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 3.6.1)
#>  rvest         0.3.5   2019-11-08 [1] CRAN (R 3.6.3)
#>  scales        1.1.0   2019-11-18 [1] CRAN (R 3.6.2)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.6.1)
#>  stringi       1.4.3   2019-03-12 [1] CRAN (R 3.6.0)
#>  stringr     * 1.4.0   2019-02-10 [1] CRAN (R 3.6.1)
#>  testthat      2.3.1   2019-12-01 [1] CRAN (R 3.6.2)
#>  tibble      * 3.0.1   2020-04-20 [1] CRAN (R 3.6.3)
#>  tidyr       * 1.0.0   2019-09-11 [1] CRAN (R 3.6.1)
#>  tidyselect    1.1.0   2020-05-11 [1] CRAN (R 3.6.3)
#>  tidyverse   * 1.3.0   2019-11-21 [1] CRAN (R 3.6.3)
#>  usethis       1.5.1   2019-07-04 [1] CRAN (R 3.6.1)
#>  utf8          1.1.4   2018-05-24 [1] CRAN (R 3.6.1)
#>  vctrs         0.3.0   2020-05-11 [1] CRAN (R 3.6.3)
#>  withr         2.1.2   2018-03-15 [1] CRAN (R 3.6.1)
#>  xfun          0.11    2019-11-12 [1] CRAN (R 3.6.2)
#>  xml2          1.2.2   2019-08-09 [1] CRAN (R 3.6.1)
#>  yaml          2.2.0   2018-07-25 [1] CRAN (R 3.6.0)
#> 
#> [1] C:/Users/xzhu/Documents/R/win-library/3.6
#> [2] C:/Program Files/R/R-3.6.0/library

1 Ответ

0 голосов
/ 19 июня 2020

Да, вы можете использовать map2:

library(dplyr)
df %>% mutate(data = purrr::map2(name, data, ~{names(.y) <- .x;.y}))

или Map в базе R:

df$data <- Map(function(x, y) {names(y) <- x;y}, df$name, df$data)

Если вы хотите использовать rowwise a аналогичный подход будет:

df %>% rowwise() %>% mutate(data = {names(data) <- name;list(data)}) 
...