Ошибка в аргументе `pivot_longer ()` при обновлении версий `tibble` - PullRequest
1 голос
/ 27 апреля 2020

Контекст

Мы хотели бы управлять данными от dat_1 в широком формате до dat_2 в длинном формате. Для этого мы решили использовать tidyr::pivot_longer() с аргументом names_pattern = '(.+)_(.+)'. Это позволяет нам собирать данные, как показано в полях, от input format до output format.

Вход данные

> dat_1

   original_id timepoint msp3_mfi msp3_dil pf_aarp_mfi pf_aarp_dil
   <chr>       <chr>        <dbl>    <int>       <dbl>       <int>
 1 id_005      C_0           10.5      400       22.2          400
 2 id_005      D10            8.5      400       10.25         400
 3 id_005      D13           11        400       10.2          400
 4 id_005      D28            8        400        9.75         400
 5 id_005      D60            7        400        0.30         400

Используемый код R

dat_2 <- dat_1 %>%
    pivot_longer(
        cols = msp3_mfi:pf_aarp_dil,
        names_to = c('antigen', 'antigen_dil'),
        names_pattern = '(.+)_(.+)',
        values_to = c('mfi', 'dil'))

Желаемый вывод данные

> dat_2 

   original_id timepoint antigen antigen_dil   mfi   dil
   <chr>       <chr>     <chr>   <chr>       <dbl> <int>
 1 id_005      C_0       msp3    mfi          10.5     NA
 2 id_005      C_0       msp3    dil         NA      400
 3 id_005      C_0       pf_aarp mfi         22.2     NA
 4 id_005      C_0       pf_aarp dil         NA      400
 5 id_005      D10       msp3    mfi          8.5     NA
 6 id_005      D10       msp3    dil         NA      400
 7 id_005      D10       pf_aarp mfi         10.25    NA
 8 id_005      D10       pf_aarp dil         NA      400
 9 id_005      D13       msp3    mfi         11       NA
10 id_005      D13       msp3    dil         NA      400
11 id_005      D13       pf_aarp mfi         10.2     NA
12 id_005      D13       pf_aarp dil         NA      400
13 id_005      D28       msp3    mfi          8       NA
14 id_005      D28       msp3    dil         NA      400
15 id_005      D28       pf_aarp mfi          9.75    NA
16 id_005      D28       pf_aarp dil         NA      400
17 id_005      D60       msp3    mfi          7       NA
18 id_005      D60       msp3    dil         NA      400
19 id_005      D60       pf_aarp mfi          0.30    NA
20 id_005      D60       pf_aarp dil         NA      400

Ошибка

Однако, когда мы обновляем сеанс de R (версия R 3.6.3) с tibble 2.1.3 к tibble. 3.0.1 получаем следующую ошибку.


Error: Assigned data `values_to` must be compatible with existing data.
x Existing data has 4 rows.
x Assigned data has 2 rows.
i Only vectors of size 1 are recycled.
Run `rlang::last_error()` to see where the error occurred.

Вопрос

Есть идеи, почему мы получаем эту ошибку в name_pattern при обновлении версии пакета tibble?

Заранее спасибо

1 Ответ

0 голосов
/ 28 апреля 2020

Хотя я не знаю , почему произошло изменение, я бы предположил, что в глубине души эта ошибка связана с тем, что ваш dat_2 столбик не является аккуратным . Повторно включать разницу между «mfi» и «dil» как в отдельный столбец antigen_dil, так и в виде двух отдельных столбцов mfi и dil.

В зависимости от значения ваших данных, два формата с pivot_longer легко работают:

dat_1 %>%
  pivot_longer(
    cols = msp3_mfi:pf_aarp_dil,
    names_to = c('antigen', '.value'),
    names_pattern = '(.+)_(.+)'
  )
#> # A tibble: 4 x 5
#>   original_id timepoint antigen   mfi   dil
#>   <chr>       <chr>     <chr>   <dbl> <dbl>
#> 1 id_005      C_0       msp3     10.5   400
#> 2 id_005      C_0       pf_aarp  22.2   400
#> 3 id_005      D10       msp3      8.5   400
#> 4 id_005      D10       pf_aarp  10.2   400

или

dat_1 %>%
  pivot_longer(
    cols = msp3_mfi:pf_aarp_dil,
    names_to = c('antigen', 'antigen_dil'),
    names_pattern = '(.+)_(.+)'
  )
#> # A tibble: 8 x 5
#>   original_id timepoint antigen antigen_dil value
#>   <chr>       <chr>     <chr>   <chr>       <dbl>
#> 1 id_005      C_0       msp3    mfi          10.5
#> 2 id_005      C_0       msp3    dil         400  
#> 3 id_005      C_0       pf_aarp mfi          22.2
#> 4 id_005      C_0       pf_aarp dil         400  
#> 5 id_005      D10       msp3    mfi           8.5
#> 6 id_005      D10       msp3    dil         400  
#> 7 id_005      D10       pf_aarp mfi          10.2
#> 8 id_005      D10       pf_aarp dil         400

Если вам действительно нужен тиббл в формате, который вы описали, вы можете использовать:

dat_1 %>%
  pivot_longer(
    cols = msp3_mfi:pf_aarp_dil,
    names_to = c('antigen', 'antigen_dil'),
    names_pattern = '(.+)_(.+)'
  ) %>% 
  mutate(
    mfi = if_else(antigen_dil == "mfi", value, NA_real_),
    dil = if_else(antigen_dil == "dil", value, NA_real_)
  ) %>%
  select(-value)
#> # A tibble: 8 x 6
#>   original_id timepoint antigen antigen_dil   mfi   dil
#>   <chr>       <chr>     <chr>   <chr>       <dbl> <dbl>
#> 1 id_005      C_0       msp3    mfi          10.5    NA
#> 2 id_005      C_0       msp3    dil          NA     400
#> 3 id_005      C_0       pf_aarp mfi          22.2    NA
#> 4 id_005      C_0       pf_aarp dil          NA     400
#> 5 id_005      D10       msp3    mfi           8.5    NA
#> 6 id_005      D10       msp3    dil          NA     400
#> 7 id_005      D10       pf_aarp mfi          10.2    NA
#> 8 id_005      D10       pf_aarp dil          NA     400

Приведенные выше фрагменты используют для создания dat_1:

library(tidyverse)

dat_1 <- 
  tribble(
    ~original_id, ~timepoint, ~msp3_mfi, ~msp3_dil, ~pf_aarp_mfi, ~pf_aarp_dil,
    "id_005",      "C_0",           10.5,      400,       22.2,          400,
    "id_005",      "D10",            8.5,      400,       10.25,         400
  )

dat_1
#> # A tibble: 2 x 6
#>   original_id timepoint msp3_mfi msp3_dil pf_aarp_mfi pf_aarp_dil
#>   <chr>       <chr>        <dbl>    <dbl>       <dbl>       <dbl>
#> 1 id_005      C_0           10.5      400        22.2         400
#> 2 id_005      D10            8.5      400        10.2         400
...