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