Jessi Brown
2009-Nov-23 20:32 UTC
[R] using contents of one column to direct addition of new rows in dataframe
Hello, R gurus. I've been trying to get R to do some data manipulation for me, and so far have been stumped in figuring out any elegant way to do so. Searches through the R-help archive haven't helped, so now I'm trying plan B. Suppose I have a dataframe that summarizes events that took place between some interval of time in days, "Time." I want to expand the dataframe to repeat each row the appropriate number of days so that Time is now = 1 for each original record. Actually, I really don't care if Time=1 is displayed in the new dataframe, as it will no longer be relevant. Also, I want to have R keep track of a time-variant variable, Date, so that it advances along one day for each new row. Here's an example of what the starting record would be like, and what I'd like to end up with:> foo.df <- data.frame(ID="N1", Date=2, Time=3) > foo.dfID Date Time 1 N1 2 3 # insert R wizardry here to get new.foo.df>new.foo.dfID Date Time N1 2 1 N1 3 1 N1 4 1 I know, or at least suspect, that there is a fairly straightforward way of doing so with building some ugly loop. But even after considering versions of "apply" and related commands, I just can't figure it out. Any help would be greatly appreciated. cheers, Jessi Brown University of Nevada, Reno
Peter Alspach
2009-Nov-23 21:39 UTC
[R] using contents of one column to direct addition of new rows indataframe
Tena koe Jessi One solution:> jessiID Date Time 1 N1 2 3 2 N2 6 4> Jessi <- jessi[rep(1:nrow(jessi), jessi[,3]),-3] > JessiID Date 1 N1 2 1.1 N1 2 1.2 N1 2 2 N2 6 2.1 N2 6 2.2 N2 6 2.3 N2 6> Jessi[,2] <- Jessi[,2]+unlist(apply(as.matrix(jessi[,3]), 1, seq))-1 > JessiID Date 1 N1 2 1.1 N1 3 1.2 N1 4 2 N2 6 2.1 N2 7 2.2 N2 8 2.3 N2 9 HTH ... Peter Alspach> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Jessi Brown > Sent: Tuesday, 24 November 2009 9:33 a.m. > To: r-help at r-project.org > Subject: [R] using contents of one column to direct addition > of new rows indataframe > > Hello, R gurus. I've been trying to get R to do some data > manipulation for me, and so far have been stumped in figuring > out any elegant way to do so. Searches through the R-help > archive haven't helped, so now I'm trying plan B. > > Suppose I have a dataframe that summarizes events that took > place between some interval of time in days, "Time." I want > to expand the dataframe to repeat each row the appropriate > number of days so that Time is now = 1 for each original > record. Actually, I really don't care if Time=1 is displayed > in the new dataframe, as it will no longer be relevant. > > Also, I want to have R keep track of a time-variant variable, > Date, so that it advances along one day for each new row. > Here's an example of what the starting record would be like, > and what I'd like to end up > with: > > > foo.df <- data.frame(ID="N1", Date=2, Time=3) foo.df > ID Date Time > 1 N1 2 3 > > # insert R wizardry here to get new.foo.df > > >new.foo.df > ID Date Time > N1 2 1 > N1 3 1 > N1 4 1 > > > I know, or at least suspect, that there is a fairly > straightforward way of doing so with building some ugly loop. > But even after considering versions of "apply" and related > commands, I just can't figure it out. Any help would be > greatly appreciated. > > cheers, Jessi Brown > > University of Nevada, Reno > > ______________________________________________ > R-help at r-project.org mailing list > 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. >
Maybe Matching Threads
- Reorganize(stack data) a dataframe inducing names
- Convertir programa Matlab a R sacado de Threshold Models of Collective Behavior de Michèle Lai & Yann Poltera
- Solve system of equations (nleqslv) only returns origin
- Doubt about a population competition function
- writing several command line in R console