вращение тидыра с несколькими переменными - PullRequest
2 голосов
/ 06 августа 2020

У меня есть tibble с именем test, который выглядит так:

   date       series_id.x  value.x series_id.y value.y
   <date>     <chr>        <dbl>   <chr>       <dbl>
 1 2020-08-03 ABC           0.1      ^FHJ          0.078
 2 2020-07-27 ABC           0.105    ^FHJ          0.093
 3 2020-07-20 ABC           0.12     ^FHJ          0.105
 4 2020-07-13 ABC           0.145    ^FHJ          0.125
 5 2020-07-06 ABC           0.15     ^FHJ          0.128
 6 2020-06-29 ABC           0.15     ^FHJ          0.125
 7 2020-06-22 ABC           0.155    ^FHJ          0.14 
 8 2020-06-15 ABC           0.175    ^FHJ          0.155
 9 2020-06-08 ABC           0.17     ^FHJ          0.153
10 2020-06-01 ABC           0.15     ^FHJ          0.128

Я пытался преобразовать этот tibble в более длинные серии данных, где series_id.x и series_id.y становятся series_id, а value.x и value.y становятся value, столбец date по существу остается неизменным (но фактически может использоваться для группировки, поскольку с каждой датой теперь связаны две серии, то есть series и value)

Я прочитал tidyr руководство по повороту в Google и попробовал несколько перестановок, ни одна из них не сработала.

Обычно я получаю:

test %>% tidyr::pivot_longer(cols=contains(c("x","y")), names_to="series_id", values_to="value")

test %>% tidyr::pivot_longer(-date, names_to="series_id", values_to="value")

test %>% tidyr::pivot_longer(-date, names_to=c("series_id", "value"), names_pattern="(.)(.)")

test %>% tidyr::pivot_longer(cols = starts_with("series_id"), names="series_id", values="value")

Все попытки были неудачными. Я знаю, что что-то пропустил, но из руководства неясно, возможен ли мой вариант использования вообще.

1 Ответ

1 голос
/ 06 августа 2020

Здесь нам может потребоваться указать разделитель .. По умолчанию он находится в режиме регулярного выражения, т.е. . может соответствовать любому символу, поэтому мы экранируем (\\). Кроме того, поскольку существует несколько наборов столбцов, укажите names_to как вектор .value и имя столбца

library(dplyr)
library(tidyr)
test %>%
    pivot_longer(cols = matches('\\.[xy]'),
      names_to = c('.value', '.series_id'), values_to = 'value', names_sep="\\.")
...