Dear John, Op ma 17 aug. 2020 om 09:52 schreef Eric Berger: | On Mon, Aug 17, 2020 at 10:49 AM Thierry Onkelinx wrote: | | | | You are looking for tidyr::pivot_longer() | | Alternatively, melt() from the reshape2 package. | | library(reshape2) | melt(x,id.vars="date",measure.vars=c("down","uc","up"),variable.name | ="direction",value.name="percentage") Also, stack is also possible to use: tab <- structure(list( date = c("2019M08", "2019M09", "2019M10"), down = c(0.01709827, 0.02094724, 0.01750911), uc = c(0.2653882, 0.2265797, 0.245003), up = c(0.7175136, 0.7524731, 0.7374879)), class = "data.frame", row.names = c(NA, -3L)) out <- utils::stack(x=tab, select=-date) colnames(out) <- c("percentage", "direction") out$date <- tab$date out <- out[,sort(colnames(out))] out yields date direction percentage 1 2019M08 down 0.01709827 2 2019M09 down 0.02094724 3 2019M10 down 0.01750911 4 2019M08 uc 0.26538820 5 2019M09 uc 0.22657970 6 2019M10 uc 0.24500300 7 2019M08 up 0.71751360 8 2019M09 up 0.75247310 9 2019M10 up 0.73748790 On 2020-08-17 07:46 -0500, Hadley Wickham wrote: | On Mon, Aug 17, 2020 at 11:23 AM Thierry Onkelinx wrote: | | | | reshape2 is a retired package. The | | author recommends to use his new | | package tidyr. | | We previously used the term retired to | suggest that the package is taking it | easy and relaxing, but isn't dead. Haha :) | This causes a lot of confusion so we | now call this state "superseded" ? | we'll continue to keep reshape2 (and | reshape!) on CRAN Good! | but they won't receive any new | features, and we believe that there | are now better approaches to solving | the same problem. Is tidyr::pivot_longer this better solution? It is an easier to understand version of the now retired and confusing (for me) tidyr::gather which at least reigned back in 2018 (was that any good compared to reshape?). Best, Rasmus -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20200817/5cd7435c/attachment.sig>
Well, not that there is anything "wrong" with previous suggestions, but it is pretty straightforward just with base R functionality:> nm <- names(tab)[2:4] > with(tab, data.frame(date = rep(date, length(nm)),+ direction = rep(nm, e = 3), + percentage = do.call(c, tab[, nm])) + ) date direction percentage down1 2019M08 down 0.01709827 down2 2019M09 down 0.02094724 down3 2019M10 down 0.01750911 uc1 2019M08 uc 0.26538820 uc2 2019M09 uc 0.22657970 uc3 2019M10 uc 0.24500300 up1 2019M08 up 0.71751360 up2 2019M09 up 0.75247310 up3 2019M10 up 0.73748790 Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Mon, Aug 17, 2020 at 9:53 AM Rasmus Liland <jral at posteo.no> wrote:> Dear John, > > Op ma 17 aug. 2020 om 09:52 schreef Eric Berger: > | On Mon, Aug 17, 2020 at 10:49 AM Thierry Onkelinx wrote: > | | > | | You are looking for tidyr::pivot_longer() > | > | Alternatively, melt() from the reshape2 package. > | > | library(reshape2) > | melt(x,id.vars="date",measure.vars=c("down","uc","up"),variable.name > | ="direction",value.name="percentage") > > Also, stack is also possible to use: > > tab <- structure(list( > date = c("2019M08", "2019M09", "2019M10"), > down = c(0.01709827, 0.02094724, 0.01750911), > uc = c(0.2653882, 0.2265797, 0.245003), > up = c(0.7175136, 0.7524731, 0.7374879)), > class = "data.frame", row.names = c(NA, -3L)) > > out <- utils::stack(x=tab, select=-date) > colnames(out) <- c("percentage", "direction") > out$date <- tab$date > out <- out[,sort(colnames(out))] > > out > > yields > > date direction percentage > 1 2019M08 down 0.01709827 > 2 2019M09 down 0.02094724 > 3 2019M10 down 0.01750911 > 4 2019M08 uc 0.26538820 > 5 2019M09 uc 0.22657970 > 6 2019M10 uc 0.24500300 > 7 2019M08 up 0.71751360 > 8 2019M09 up 0.75247310 > 9 2019M10 up 0.73748790 > > On 2020-08-17 07:46 -0500, Hadley Wickham wrote: > | On Mon, Aug 17, 2020 at 11:23 AM Thierry Onkelinx wrote: > | | > | | reshape2 is a retired package. The > | | author recommends to use his new > | | package tidyr. > | > | We previously used the term retired to > | suggest that the package is taking it > | easy and relaxing, but isn't dead. > > Haha :) > > | This causes a lot of confusion so we > | now call this state "superseded" ? > | we'll continue to keep reshape2 (and > | reshape!) on CRAN > > Good! > > | but they won't receive any new > | features, and we believe that there > | are now better approaches to solving > | the same problem. > > Is tidyr::pivot_longer this better > solution? It is an easier to understand > version of the now retired and confusing > (for me) tidyr::gather which at least > reigned back in 2018 (was that any good > compared to reshape?). > > Best, > Rasmus > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
On 2020-08-17 10:09 -0700, Bert Gunter wrote: | On Mon, Aug 17, 2020 at 9:53 AM Rasmus Liland wrote: | | | | Also, stack is also possible to use: | | | | tab <- structure(list( | | date = c("2019M08", "2019M09", "2019M10"), | | down = c(0.01709827, 0.02094724, 0.01750911), | | uc = c(0.2653882, 0.2265797, 0.245003), | | up = c(0.7175136, 0.7524731, 0.7374879)), | | class = "data.frame", row.names = c(NA, -3L)) | | | | out <- utils::stack(x=tab, select=-date) | | colnames(out) <- c("percentage", "direction") | | out$date <- tab$date | | out <- out[,sort(colnames(out))] | | Well, not that there is anything | "wrong" with previous suggestions, but | it is pretty straightforward just with | base R functionality: | | > nm <- names(tab)[2:4] | > with(tab, data.frame(date = rep(date, length(nm)), | + direction = rep(nm, e = 3), | + percentage = do.call(c, tab[, nm])) | + ) This is good :) You can also use unlist directly instead of do.call(c, ...) nm <- names(tab)[2:4] data.frame( date=tab$date, direction=rep(nm, each=length(nm)), percentage=unlist(tab[,nm])) V r -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20200817/183d666d/attachment.sig>
> | but they won't receive any new > | features, and we believe that there > | are now better approaches to solving > | the same problem. > > Is tidyr::pivot_longer this better > solution? It is an easier to understand > version of the now retired and confusing > (for me) tidyr::gather which at least > reigned back in 2018 (was that any good > compared to reshape?).Yes, and hopefully :) library(tidyr) tab <- structure(list( date = c("2019M08", "2019M09", "2019M10"), down = c(0.01709827, 0.02094724, 0.01750911), uc = c(0.2653882, 0.2265797, 0.245003), up = c(0.7175136, 0.7524731, 0.7374879)), class = "data.frame", row.names = c(NA, -3L)) tab %>% pivot_longer( down:up, names_to = "direction", values_to = "percentage" ) #> # A tibble: 9 x 3 #> date direction percentage #> <chr> <chr> <dbl> #> 1 2019M08 down 0.0171 #> 2 2019M08 uc 0.265 #> 3 2019M08 up 0.718 #> 4 2019M09 down 0.0209 #> 5 2019M09 uc 0.227 #> 6 2019M09 up 0.752 #> 7 2019M10 down 0.0175 #> 8 2019M10 uc 0.245 #> 9 2019M10 up 0.737 <sup>Created on 2020-08-17 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup> -- http://hadley.nz