I have a list of data as follows.> list(data.frame(name="sample1", red=20), data.frame(name="sample1", green=15), data.frame(name="sample2", red=10), data.frame(name="sample 2", green=30))[[1]] name red 1 sample1 20 [[2]] name green 1 sample1 15 [[3]] name red 1 sample2 10 [[4]] name green 1 sample2 30 I would like to massage this into a data frame like this: name red green 1 sample1 20 15 2 sample2 10 30 I'm imagining I can use aggregate(mylist, by=samplenames, merge) right? But how do I get the list of samplenames? How do I subset each dataframe inside the list?
I manually constructed the list of sample names and tried the aggregate call I mentioned. Merge works when called manually, but not when using aggregate.> mylist <- list(data.frame(name="sample1", red=20), data.frame(name="sample1", green=15), data.frame(name="sample2", red=10), data.frame(na me="sample2", green=30)) > names <- list("sample1", "sample1", "sample2", "sample2") > merge(mylist[1], mylist[2])name red green 1 sample1 20 15> merge(mylist[3], mylist[4])name red green 1 sample2 10 30> aggregate(mylist, by=as.list(names), merge)Error in as.data.frame(y) : argument "y" is missing, with no default What's the right way to do this? On Fri, Jun 3, 2016 at 1:20 PM, Ed Siefker <ebs15242 at gmail.com> wrote:> I have a list of data as follows. > >> list(data.frame(name="sample1", red=20), data.frame(name="sample1", green=15), data.frame(name="sample2", red=10), data.frame(name="sample 2", green=30)) > [[1]] > name red > 1 sample1 20 > > [[2]] > name green > 1 sample1 15 > > [[3]] > name red > 1 sample2 10 > > [[4]] > name green > 1 sample2 30 > > > I would like to massage this into a data frame like this: > > name red green > 1 sample1 20 15 > 2 sample2 10 30 > > > I'm imagining I can use aggregate(mylist, by=samplenames, merge) > right? But how do I get the list of samplenames? How do I subset > each dataframe inside the list?
aggregate isn't really what I want. Maybe tapply? I still can't get it to work.> length(mylist)[1] 4> length(names)[1] 4> tapply(mylist, names, merge)Error in tapply(mylist, names, merge) : arguments must have same length I guess because a list isn't an atomic data type. What function will do the same on lists? lapply doesn't have a 'by' argument. On Fri, Jun 3, 2016 at 1:41 PM, Ed Siefker <ebs15242 at gmail.com> wrote:> I manually constructed the list of sample names and tried the > aggregate call I mentioned. > Merge works when called manually, but not when using aggregate. > >> mylist <- list(data.frame(name="sample1", red=20), data.frame(name="sample1", green=15), data.frame(name="sample2", red=10), data.frame(na me="sample2", green=30)) >> names <- list("sample1", "sample1", "sample2", "sample2") >> merge(mylist[1], mylist[2]) > name red green > 1 sample1 20 15 >> merge(mylist[3], mylist[4]) > name red green > 1 sample2 10 30 >> aggregate(mylist, by=as.list(names), merge) > Error in as.data.frame(y) : argument "y" is missing, with no default > > What's the right way to do this? > > On Fri, Jun 3, 2016 at 1:20 PM, Ed Siefker <ebs15242 at gmail.com> wrote: >> I have a list of data as follows. >> >>> list(data.frame(name="sample1", red=20), data.frame(name="sample1", green=15), data.frame(name="sample2", red=10), data.frame(name="sample 2", green=30)) >> [[1]] >> name red >> 1 sample1 20 >> >> [[2]] >> name green >> 1 sample1 15 >> >> [[3]] >> name red >> 1 sample2 10 >> >> [[4]] >> name green >> 1 sample2 30 >> >> >> I would like to massage this into a data frame like this: >> >> name red green >> 1 sample1 20 15 >> 2 sample2 10 30 >> >> >> I'm imagining I can use aggregate(mylist, by=samplenames, merge) >> right? But how do I get the list of samplenames? How do I subset >> each dataframe inside the list?
Hello, Maybe something like the following. lst <- list(data.frame(name="sample1", red=20), data.frame(name="sample1", green=15), data.frame(name="sample2", red=10), data.frame(name="sample 2", green=30)) fun <- function(DF){ ?? ?data.frame(name = DF[, 1], color = colnames(DF)[2], colnum = DF[, 2]) } lst2 <- lapply(lst, fun) result <- do.call(rbind, lst2) result Hope this helps, Rui Barradas ? Citando Ed Siefker <ebs15242 at gmail.com>:> I have a list of data as follows. >> list(data.frame(name="sample1", red=20), data.frame(name="sample1", >> green=15), data.frame(name="sample2", red=10), >> data.frame(name="sample 2", green=30)) > > [[1]] > ? ? name red > 1 sample1? 20 > > [[2]] > ? ? name green > 1 sample1? ? 15 > > [[3]] > ? ? name red > 1 sample2? 10 > > [[4]] > ? ? name green > 1 sample2? ? 30 > > I would like to massage this into a data frame like this: > > ? ? name red green > 1 sample1? 20? ? 15 > 2 sample2? 10? ? 30 > > I'm imagining I can use aggregate(mylist, by=samplenames, merge) > right?? But how do I get the list of samplenames?? How do I subset > each dataframe inside the list? > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.htmland provide commented, > minimal, self-contained, reproducible code.? [[alternative HTML version deleted]]
Hello, Sorry, forget my first answer, I misunderstood what you wanted. Let's try again. First of all you have a typo in your second sample2, you wrote 'sample 2' with a space. Now try this. fun2 <- function(n){ ?? ?merge(lst[[n]], lst[[n + 1]]) } N <- which(seq_along(lst) %% 2 == 1) lst2 <- lapply(N, fun2) result <- do.call(rbind, lst2) result Hope this helps, Rui Barradas ? Citando Ed Siefker <ebs15242 at gmail.com>:> I have a list of data as follows. >> list(data.frame(name="sample1", red=20), data.frame(name="sample1", >> green=15), data.frame(name="sample2", red=10), >> data.frame(name="sample 2", green=30)) > > [[1]] > ? ? name red > 1 sample1? 20 > > [[2]] > ? ? name green > 1 sample1? ? 15 > > [[3]] > ? ? name red > 1 sample2? 10 > > [[4]] > ? ? name green > 1 sample2? ? 30 > > I would like to massage this into a data frame like this: > > ? ? name red green > 1 sample1? 20? ? 15 > 2 sample2? 10? ? 30 > > I'm imagining I can use aggregate(mylist, by=samplenames, merge) > right?? But how do I get the list of samplenames?? How do I subset > each dataframe inside the list? > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.htmland provide commented, > minimal, self-contained, reproducible code.? [[alternative HTML version deleted]]
I would probably do it this way, tmp <- list(data.frame(name="sample1", red=20), data.frame(name="sample1", green=15), data.frame(name="sample2", red=10), data.frame(name="sample2", green=30)) fun1 <- function(df) data.frame(name=df$name, color=names(df)[2], value=df[[2]]) tmp1 <- lapply(tmp,fun1) tmp2 <- do.call(rbind,tmp1) tmp3 <- reshape(tmp2, idvar='name', timevar='color', direction='wide') This does the job, except for the extraneous "value." [and they can easily be removed using gsub()]. Whether or not it will work for a more general case, I don't know. -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 On 6/3/16, 11:20 AM, "R-help on behalf of Ed Siefker" <r-help-bounces at r-project.org on behalf of ebs15242 at gmail.com> wrote:>I have a list of data as follows. > >> list(data.frame(name="sample1", red=20), data.frame(name="sample1", >>green=15), data.frame(name="sample2", red=10), data.frame(name="sample >>2", green=30)) >[[1]] > name red >1 sample1 20 > >[[2]] > name green >1 sample1 15 > >[[3]] > name red >1 sample2 10 > >[[4]] > name green >1 sample2 30 > > >I would like to massage this into a data frame like this: > > name red green >1 sample1 20 15 >2 sample2 10 30 > > >I'm imagining I can use aggregate(mylist, by=samplenames, merge) >right? But how do I get the list of samplenames? How do I subset >each dataframe inside the list? > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >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.