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.