Dimitri Liakhovitski
2010-Jun-29 17:22 UTC
[R] transposing a data frame from horizontal to vertical (stacking)
Hello, everyone!
I have a very simple task - I have a data frame (see MyData below) and
I need to stack the data (see result below).
I wrote the syntax below - it's very basic and it does what I need.
But I am sure what I am trying to do is a very typical task and there
must be a much shorter/more elegant way of doing it.
Any advice?
Thank you very much!
MyData<-data.frame(names=c("John","Mary","Paul","Debby"),jan=c(10,15,20,25),feb=c(1,2,3,4))
(MyData)
months<-names(MyData)[-1]
people<-as.character(MyData[[1]])
### Creating a temp matrix with people as columns and months as rows:
transposed<-apply(MyData[-1],1,t)
### Putting vertical data (months as rows) - for each person - into a list:
list.of.stacked<-list()
for(i in 1:ncol(transposed)){
list.of.stacked[[i]]<-as.data.frame(matrix(ncol=3,nrow=length(months)))
names(list.of.stacked[[i]])<-c("month","values","person")
list.of.stacked[[i]][["month"]]<-months
list.of.stacked[[i]][["values"]]<-transposed[1:nrow(transposed),i]
list.of.stacked[[i]][["person"]]<-people[i]
}
(list.of.stacked)
### Creating a data frame from the list:
result<-do.call(rbind,list.of.stacked)
(result)
--
Dimitri Liakhovitski
Ninah Consulting
www.ninah.com
Hadley Wickham
2010-Jun-29 17:25 UTC
[R] transposing a data frame from horizontal to vertical (stacking)
On Tue, Jun 29, 2010 at 12:22 PM, Dimitri Liakhovitski <dimitri.liakhovitski at gmail.com> wrote:> Hello, everyone! > I have a very simple task - I have a data frame (see MyData below) and > I need to stack the data (see result below). > I wrote the syntax below - it's very basic and it does what I need. > But I am sure what I am trying to do is a very typical task and there > must be a much shorter/more elegant way of doing it. > Any advice?library(reshape) melt(MyData) Hadley -- Assistant Professor / Dobelman Family Junior Chair Department of Statistics / Rice University http://had.co.nz/
Henrique Dallazuanna
2010-Jun-29 17:46 UTC
[R] transposing a data frame from horizontal to vertical (stacking)
Try this:
reshape(MyData, direction = 'long', varying = list(c('jan',
'feb')), idvar 2:3)
On Tue, Jun 29, 2010 at 2:22 PM, Dimitri Liakhovitski <
dimitri.liakhovitski@gmail.com> wrote:
> Hello, everyone!
> I have a very simple task - I have a data frame (see MyData below) and
> I need to stack the data (see result below).
> I wrote the syntax below - it's very basic and it does what I need.
> But I am sure what I am trying to do is a very typical task and there
> must be a much shorter/more elegant way of doing it.
> Any advice?
>
> Thank you very much!
>
>
>
>
MyData<-data.frame(names=c("John","Mary","Paul","Debby"),jan=c(10,15,20,25),feb=c(1,2,3,4))
> (MyData)
> months<-names(MyData)[-1]
> people<-as.character(MyData[[1]])
>
> ### Creating a temp matrix with people as columns and months as rows:
> transposed<-apply(MyData[-1],1,t)
>
> ### Putting vertical data (months as rows) - for each person - into a list:
> list.of.stacked<-list()
> for(i in 1:ncol(transposed)){
>
> list.of.stacked[[i]]<-as.data.frame(matrix(ncol=3,nrow=length(months)))
>
names(list.of.stacked[[i]])<-c("month","values","person")
> list.of.stacked[[i]][["month"]]<-months
>
list.of.stacked[[i]][["values"]]<-transposed[1:nrow(transposed),i]
> list.of.stacked[[i]][["person"]]<-people[i]
> }
> (list.of.stacked)
>
> ### Creating a data frame from the list:
> result<-do.call(rbind,list.of.stacked)
> (result)
>
>
> --
> Dimitri Liakhovitski
> Ninah Consulting
> www.ninah.com
>
> ______________________________________________
> R-help@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.
>
--
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O
[[alternative HTML version deleted]]