My question is about how to select and rearrange the data to a new data frame Here is an example: Samples counts time A 10 3 A 12 4 A 11 3 B 12 4 B 10 5 C 11 2 C 13 3 Say, if I want to make a new table that only look at ?counts? as below: A B C 10 12 11 12 10 13 11 How can I do this in R? Thank you! .
Rearrange Data Frame
3 messages · Stella Xu, Sarah Goslee, Jim Lemon
Hi Stella,
On Wed, Jul 29, 2015 at 1:14 PM, Stella Xu <Stella.Xu at hli.ubc.ca> wrote:
My question is about how to select and rearrange the data to a new data frame Here is an example: Samples counts time A 10 3 A 12 4 A 11 3 B 12 4 B 10 5 C 11 2 C 13 3 Say, if I want to make a new table that only look at ?counts? as below: A B C 10 12 11 12 10 13 11 How can I do this in R? Thank you!
Your example data doesn't use time at all, and contains a duplicate
pair of A,?,3 - what do you want to have happen there? How should
duplicates be handled? How should the ordering of values work? If
instead that should be a 5, here's something that is almost what you
want (but I find more useful):
x <- structure(list(Samples = c("A", "A", "A", "B", "B", "C", "C"),
counts = c(10L, 12L, 11L, 12L, 10L, 11L, 13L), time = c(3L,
4L, 5L, 4L, 5L, 2L, 3L)), .Names = c("Samples", "counts",
"time"), class = "data.frame", row.names = c(NA, -7L))
library(reshape2)
dcast(x, time ~ Samples, value.var="counts", sum)
time A B C
1 2 0 0 11
2 3 10 0 13
3 4 12 12 0
4 5 11 10 0
If you want the results "scooted up", I think there was recently a
discussion on this list on doing so.
Sarah
Sarah Goslee http://www.functionaldiversity.org
Hi Stella,
I think Sarah is correct in asking if that is what you really want,
but you can get a list similar to what you asked for like this:
sample_names<-unique(sx.df$Samples)
sx.lst<-list()
for(sn in 1:length(sample_names))
sx.lst[[sn]]<-sx.df$counts[sx.df$Samples==sample_names[sn]]
names(sx.lst)<-sample_names
If you really want a data frame, you will have to coerce the number of
values in each element of the list to the same length:
maxlen<-max(unlist(lapply(sx.lst,length)))
for(i in 1:length(sx.lst)) {
to_fill<-maxlen-length(sx.lst[[i]])
if(to_fill > 0) sx.lst[[i]]<-c(sx.lst[[i]],rep(NA,to_fill))
}
sx2.df<-as.data.frame(sx.lst)
Jim
On Thu, Jul 30, 2015 at 6:48 AM, Sarah Goslee <sarah.goslee at gmail.com> wrote:
Hi Stella, On Wed, Jul 29, 2015 at 1:14 PM, Stella Xu <Stella.Xu at hli.ubc.ca> wrote:
My question is about how to select and rearrange the data to a new data frame Here is an example: Samples counts time A 10 3 A 12 4 A 11 3 B 12 4 B 10 5 C 11 2 C 13 3 Say, if I want to make a new table that only look at ?counts? as below: A B C 10 12 11 12 10 13 11 How can I do this in R? Thank you!
Your example data doesn't use time at all, and contains a duplicate
pair of A,?,3 - what do you want to have happen there? How should
duplicates be handled? How should the ordering of values work? If
instead that should be a 5, here's something that is almost what you
want (but I find more useful):
x <- structure(list(Samples = c("A", "A", "A", "B", "B", "C", "C"),
counts = c(10L, 12L, 11L, 12L, 10L, 11L, 13L), time = c(3L,
4L, 5L, 4L, 5L, 2L, 3L)), .Names = c("Samples", "counts",
"time"), class = "data.frame", row.names = c(NA, -7L))
library(reshape2)
dcast(x, time ~ Samples, value.var="counts", sum)
time A B C
1 2 0 0 11
2 3 10 0 13
3 4 12 12 0
4 5 11 10 0
If you want the results "scooted up", I think there was recently a
discussion on this list on doing so.
Sarah
--
Sarah Goslee
http://www.functionaldiversity.org
______________________________________________ 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.