Hi, I'm a total beginner in R and this question is probably very simple but I've spent hours reading about it and can't find the answer. I'm trying to reshape a data table from long to wide format. I've tried reshape() and cast() but I get error messages every time and I can't figure why. In my data, I have the length of two fish from each family. My data table (called fish) looks like this: family length 14 18 14 7 15 7 15 21 17 50 17 21 18 36 18 21 20 36 20 42 24 56 24 42 25 43 25 56 27 15 27 42 28 7 28 42 29 56 29 49 I want it to look like this: family kid1 kid2 14 18 7 15 7 21 17 50 21 18 36 21 28 36 42 24 56 42 25 43 56 27 15 42 28 7 42 29 56 49 I've tried:>cast( fish, fam~length)and got the error message: Using length as value column. Use the value argument to cast to override this choice Error in `[.data.frame`(data, , variables, drop = FALSE) : undefined columns selected Then I rename the columns:>myvars<-c("fam","length") >fish<-fish[myvars]and try the cast() again with no luck (same error) By using reshape() I don't get the results I want:>reshape(rdm1, timevar="fam", idvar=c("length"), direction="wide") > head(first)length 14.20 14 14.19 7 15.25 21 17.30 50 18.32 36 20.36 42 Can someone help with this? Thanks a lot! -- View this message in context: http://r.789695.n4.nabble.com/Reshape-from-long-to-wide-tp4486875p4486875.html Sent from the R help mailing list archive at Nabble.com.
Hi aly,
Try
# your data
x <- structure(list(family = c(14L, 14L, 15L, 15L, 17L, 17L, 18L,
18L, 20L, 20L, 24L, 24L, 25L, 25L, 27L, 27L, 28L, 28L, 29L, 29L
), length = c(18L, 7L, 7L, 21L, 50L, 21L, 36L, 21L, 36L, 42L,
56L, 42L, 43L, 56L, 15L, 42L, 7L, 42L, 56L, 49L)), .Names =
c("family",
"length"), class = "data.frame", row.names = c(NA, -20L))
# processing
require(plyr)
ddply(x, .(family), function(df) c(kid1 = df$length[1], kid2 df$length[2]))
   family kid1 kid2
1      14   18    7
2      15    7   21
3      17   50   21
4      18   36   21
5      20   36   42
6      24   56   42
7      25   43   56
8      27   15   42
9      28    7   42
10     29   56   49
HTH,
Jorge.-
On Mon, Mar 19, 2012 at 7:01 PM, aly <> wrote:
> Hi,
>
> I'm a total beginner in R and this question is probably very simple but
> I've
> spent hours reading about it and can't find the answer. I'm trying
to
> reshape a data table from long to wide format. I've tried reshape() and
> cast() but I get error messages every time and I can't figure why. In
my
> data, I have the length of two fish from each family. My data table (called
> fish) looks like this:
>
> family  length
> 14      18
> 14      7
> 15      7
> 15      21
> 17      50
> 17      21
> 18      36
> 18      21
> 20      36
> 20      42
> 24      56
> 24      42
> 25      43
> 25      56
> 27      15
> 27      42
> 28      7
> 28      42
> 29      56
> 29      49
>
> I want it to look like this:
>
> family kid1 kid2
> 14      18      7
> 15      7       21
> 17      50      21
> 18      36      21
> 28      36      42
> 24      56      42
> 25      43      56
> 27      15      42
> 28      7       42
> 29      56      49
>
> I've tried:
>
> >cast( fish, fam~length)
>
> and got the error message:
>
> Using length as value column.  Use the value argument to cast to override
> this choice
> Error in `[.data.frame`(data, , variables, drop = FALSE) :
>  undefined columns selected
>
> Then I rename the columns:
>
> >myvars<-c("fam","length")
> >fish<-fish[myvars]
>
> and try the cast() again with no luck (same error)
>
> By using reshape() I don't get the results I want:
>
> >reshape(rdm1, timevar="fam", idvar=c("length"),
direction="wide")
> > head(first)
>               length
> 14.20        14
> 14.19         7
> 15.25        21
> 17.30        50
> 18.32        36
> 20.36        42
>
> Can someone help with this? Thanks a lot!
>
>
>
>
> --
> View this message in context:
>
http://r.789695.n4.nabble.com/Reshape-from-long-to-wide-tp4486875p4486875.html
> Sent from the R help mailing list archive at Nabble.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.
>
	[[alternative HTML version deleted]]
On Mon, Mar 19, 2012 at 7:01 PM, aly <alyabadia at gmaaaail.com> wrote:> > Hi, > > I'm a total beginner in R and this question is probably very simple but I've > spent hours reading about it and can't find the answer. I'm trying to > reshape a data table from long to wide format. I've tried reshape() and > cast() but I get error messages every time and I can't figure why. In my > data, I have the length of two fish from each family. My data table (called > fish) looks like this: > > family ?length > 14 ? ? ?18 > 14 ? ? ?7 > 15 ? ? ?7 > 15 ? ? ?21 > 17 ? ? ?50 > 17 ? ? ?21 > 18 ? ? ?36 > 18 ? ? ?21 > 20 ? ? ?36 > 20 ? ? ?42 > 24 ? ? ?56 > 24 ? ? ?42 > 25 ? ? ?43 > 25 ? ? ?56 > 27 ? ? ?15 > 27 ? ? ?42 > 28 ? ? ?7 > 28 ? ? ?42 > 29 ? ? ?56 > 29 ? ? ?49 > > I want it to look like this: > > family kid1 kid2 > 14 ? ? ?18 ? ? ?7 > 15 ? ? ?7 ? ? ? 21 > 17 ? ? ?50 ? ? ?21 > 18 ? ? ?36 ? ? ?21 > 28 ? ? ?36 ? ? ?42 > 24 ? ? ?56 ? ? ?42 > 25 ? ? ?43 ? ? ?56 > 27 ? ? ?15 ? ? ?42 > 28 ? ? ?7 ? ? ? 42 > 29 ? ? ?56 ? ? ?49Here are a few solutions. First create fish2 from fish: fish2 <- data.frame(fish, kid = c("kid1", "kid2")) # 1 xtabs(length ~ family + kid, DF2) # 2 reshape(data = DF2, dir = "wide", timevar = "kid", idvar = "family") # 3 with(fish2, data.frame(family = unique(family), kid1 = length[kid == "kid1"], kid2 = length[kid == "kid2"])) # 4 library(reshape) cast(family ~ kid, data = fish2, value = "length") # 5 library(reshape2) dcast(family ~ kid, data = fish2, value.var = "length") -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com