Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple variables tidyr pivoting

Tags:

r

dplyr

pivot

tidyr

I Have a tibble called test looking like this:

   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

I was trying to pivot this tibble into longer series of data, where series_id.x and series_id.y become series_id, and value.x and value.y become value, date column essentially remains unchanged (but actually can be used to do grouping as each date now has two series associated with it, i.e series and value)

I've read the tidyr pivoting guide on google and have tried a few permutations, none of them worked.

Typically I got:

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")

All above were failed attempts. I know I missed something, but it's not clear from guide whether my use-case is possible at all.

like image 444
stucash Avatar asked Dec 11 '25 23:12

stucash


1 Answers

Here, we may need to specify the delimiter which is .. By default, it is in regex mode i.e. . can match any character, so we escape (\\). Also, as there are multiple set of columns, specify the names_to as a vector of .value and the column name

library(dplyr)
library(tidyr)
test %>%
    pivot_longer(cols = matches('\\.[xy]'),
      names_to = c('.value', '.series_id'), values_to = 'value', names_sep="\\.")
like image 199
akrun Avatar answered Dec 13 '25 15:12

akrun



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!