[R] stacking consecutive columns
Graves, Gregory
ggraves at sfwmd.gov
Wed Nov 17 16:37:54 CET 2010
Follows is the exact solution to this:
v <- NULL
#note that decreasing is FALSE so preceding year preceeds
for(i in 2:46) {
kk <- melt(yearmonth[, c(1, i, i+1)], id.vars="month", variable_name="year")
v[[i-1]] <- kk[order(kk$year, decreasing=FALSE),]
}
x <- do.call(cbind, v)
write.table(x,"clipboard",sep=" ",col.names=NA) #export to Excell via Ctrl-V
Gregory A. Graves, Lead Scientist
Everglades REstoration COoordination and VERification (RECOVER)
Restoration Sciences Department
South Florida Water Management District
Phones: DESK: 561 / 682 - 2429
CELL: 561 / 719 - 8157
-----Original Message-----
From: Patrick Hausmann [mailto:patrick.hausmann at uni-bremen.de]
Sent: Wednesday, November 17, 2010 9:49 AM
To: r-help at r-project.org; Graves, Gregory
Subject: Re: [R] stacking consecutive columns
Hi Gregory,
is this what you want? Ok, not the most elegant way...
# using 'melt' from the 'reshape' package
library(reshape)
Data <- data.frame(month = 1:12,
x2002 = runif(12),
x2003 = runif(12),
x2004 = runif(12),
x2005 = runif(12))
v <- NULL
for(i in 2:4) {
kk <- melt(Data[, c(1, i, i+1)], id.vars="month", variable_name="year")
v[[i-1]] <- kk[order(kk$year, decreasing=TRUE),]
}
out <- do.call(cbind, v)
HTH
Patrick
Am 17.11.2010 15:03, schrieb Graves, Gregory:
> I have a file, each column of which is a separate year, and each row of each column is mean precipitation for that month. Looks like this (except it goes back to 1964).
>
> month X2000 X2001 X2002 X2003 X2004 X2005 X2006 X2007 X2008 X2009
> 1 1.600 1.010 4.320 2.110 0.925 3.275 3.460 0.675 1.315 2.920
> 2 2.960 3.905 3.230 2.380 2.720 1.880 2.430 1.380 2.480 2.380
> 3 1.240 1.815 1.755 1.785 1.250 3.940 10.025 0.420 2.845 2.460
> 4 3.775 1.350 2.745 0.170 0.710 2.570 0.255 0.425 4.470 1.250
> 5 4.050 1.385 5.650 1.515 12.005 6.895 7.020 4.060 7.725 2.775
> 6 8.635 8.900 15.715 12.680 16.270 12.605 7.095 7.025 10.465 7.345
> 7 5.475 7.955 7.880 6.670 7.955 7.355 5.475 5.650 7.255 7.985
> 8 8.435 5.525 7.120 6.250 7.150 7.610 5.525 6.500 6.275 10.405
> 9 5.855 7.830 7.250 7.355 9.715 7.850 6.385 7.960 4.485 7.250
> 10 7.965 11.915 6.735 8.125 7.855 10.465 4.340 6.165 2.400 3.240
> 11 1.705 1.525 0.905 1.670 1.840 2.100 0.255 2.830 4.425 1.645
> 12 2.335 0.840 0.795 1.890 0.145 1.700 0.260 2.160 2.300 2.220
>
> What I want to do is to stack 2008 data underneath 2009 data, 2007 under 2008, 2006 under 2007, etc. I have so far figured out that I can do this with the following clumsy approach:
>
> a=stack(yearmonth,select=c(X2009,X2008))
> b=stack(yearmonth,select=c(X2008,X2007))
> x=as.data.frame(c(a,b))
> write.table(x,"clipboard",sep=" ",col.names=NA) #then paste this back into Excel to get this
>
>
> values ind values.1 ind.1
> 1 0.275 X2009 1.285 X2008
> 2 0.41 X2009 3.85 X2008
> 3 1.915 X2009 3.995 X2008
> 4 1.25 X2009 3.845 X2008
> 5 8.76 X2009 2.095 X2008
> 6 8.65 X2009 8.29 X2008
> 7 7.175 X2009 9.405 X2008
> 8 7.19 X2009 13.44 X2008
> 9 8.13 X2009 7.245 X2008
> 10 1.46 X2009 5.645 X2008
> 11 2.56 X2009 0.535 X2008
> 12 5.01 X2009 1.225 X2008
> 13 1.285 X2008 0.72 X2007
> 14 3.85 X2008 1.89 X2007
> 15 3.995 X2008 1.035 X2007
> 16 3.845 X2008 2.86 X2007
> 17 2.095 X2008 3.785 X2007
> 18 8.29 X2008 9.62 X2007
> 19 9.405 X2008 9.245 X2007
> 20 13.44 X2008 5.595 X2007
> 21 7.245 X2008 8.4 X2007
> 22 5.645 X2008 6.705 X2007
> 23 0.535 X2008 1.47 X2007
> 24 1.225 X2008 1.665 X2007
>
>
> Is there an easier, cleaner way to do this? Thanks.
>
> Gregory A. Graves, Lead Scientist
> Everglades REstoration COoordination and VERification (RECOVER)
> Restoration Sciences Department
> South Florida Water Management District
> Phones: DESK: 561 / 682 - 2429
> CELL: 561 / 719 - 8157
>
> ______________________________________________
> 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.
More information about the R-help
mailing list