[R] dplyr - add/expand rows

Bert Gunter bgunter.4567 at gmail.com
Sun Nov 26 20:10:06 CET 2017


To David W.'s point about lack of a suitable reprex ("reproducible
example"), Bill's solution seems to be for only one station.

Here is a reprex and modification that I think does what was requested for
multiple stations, again using base R and data frames, not dplyr and
tibbles.

First the reprex with **two** stations:

> d <- data.frame( station = rep(c("one","two"),c(5,4)),
               from = c(60,61,71,72,76,60,65,82,83),
                to = c(60,70,71,76,83,64, 81, 82,83),
                record = c("A","B","C","B","D","B","B","D","E"))

> d
  station from to record
1     one   60 60      A
2     one   61 70      B
3     one   71 71      C
4     one   72 76      B
5     one   76 83      D
6     two   60 64      B
7     two   65 81      B
8     two   82 82      D
9     two   83 83      E

## Now the conversion code using base R, especially by():

> out <- by(d, d$station, function(x) with(x, {
+    i <- to - from +1
+    data.frame(YEAR =sequence(i) -1 +rep(from,i), RECORD =rep(record,i))
+ }))


> out <- data.frame(station =
rep(names(out),sapply(out,nrow)),do.call(rbind,out), row.names = NULL)


> out
   station YEAR RECORD
1      one   60      A
2      one   61      B
3      one   62      B
4      one   63      B
5      one   64      B
6      one   65      B
7      one   66      B
8      one   67      B
9      one   68      B
10     one   69      B
11     one   70      B
12     one   71      C
13     one   72      B
14     one   73      B
15     one   74      B
16     one   75      B
17     one   76      B
18     one   76      D
19     one   77      D
20     one   78      D
21     one   79      D
22     one   80      D
23     one   81      D
24     one   82      D
25     one   83      D
26     two   60      B
27     two   61      B
28     two   62      B
29     two   63      B
30     two   64      B
31     two   65      B
32     two   66      B
33     two   67      B
34     two   68      B
35     two   69      B
36     two   70      B
37     two   71      B
38     two   72      B
39     two   73      B
40     two   74      B
41     two   75      B
42     two   76      B
43     two   77      B
44     two   78      B
45     two   79      B
46     two   80      B
47     two   81      B
48     two   82      D
49     two   83      E

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 Sat, Nov 25, 2017 at 4:49 PM, William Dunlap via R-help <
r-help at r-project.org> wrote:

> dplyr may have something for this, but in base R I think the following does
> what you want.  I've shortened the name of your data set to 'd'.
>
> i <- rep(seq_len(nrow(d)), d$YEAR_TO-d$YEAR_FROM+1)
> j <- sequence(d$YEAR_TO-d$YEAR_FROM+1)
> transform(d[i,], YEAR=YEAR_FROM+j-1, YEAR_FROM=NULL, YEAR_TO=NULL)
>
>
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
>
> On Sat, Nov 25, 2017 at 11:18 AM, Hutchinson, David (EC) <
> david.hutchinson at canada.ca> wrote:
>
> > I have a returned tibble of station operational record similar to the
> > following:
> >
> > > data.collection
> > # A tibble: 5 x 4
> >   STATION_NUMBER YEAR_FROM YEAR_TO RECORD
> >            <chr>     <int>   <int>  <chr>
> > 1        07EA001      1960    1960    QMS
> > 2        07EA001      1961    1970    QMC
> > 3        07EA001      1971    1971    QMM
> > 4        07EA001      1972    1976    QMC
> > 5        07EA001      1977    1983    QRC
> >
> > I would like to reshape this to one operational record (row) per year per
> > station. Something like:
> >
> > 07EA001              1960      QMS
> > 07EA001              1961      QMC
> > 07EA001              1962      QMC
> > 07EA001              1963      QMC
> > ...
> > 07EA001              1971      QMM
> >
> > Can this be done in dplyr easily?
> >
> > Thanks in advance,
> >
> > David
> >
> >         [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > 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]]
>
> ______________________________________________
> 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]]



More information about the R-help mailing list