Luke Neraas
2007-Sep-27 23:17 UTC
[R] create data frame(s) from a list with different numbers of rows
# Hello, # I have a list with 6 categories and with different numbers of rows. # I would like to change each of them into a unique data frame in order to match # values with other data frames and perform some calculations. # Or I could make each category or list element have the same number of rows and create one large data.frame. # below is a creation of a sample list # I apologize for the length in creating the list it is the only way i could figure # out how to convey my puzzle. If you scroll down you will find it as " list.sample." Loci<-4 Pairwise<- (Loci*(Loci-1))/2 #Creation of list elements c1<- c(1,4,3,2,4,1,3,2,4,3) c2<- c(2,4,3,4,2,3,4,1,3,2) c3<- c(1,3,2,4,4,3,4,4,2,2) c4<- c(2,3,2,3,1,3,2,4,4,3) c5<- c(1,2,1,1,2,2,3,3,2,1) c6<- c(3,2,4,3,1,1,2,3,3,4) c7<- c(1,2,1,2,3,2,3,2,1,2) c8<- c(1,2,2,3,2,3,3,4,1,2) List.elements<-cbind(c1,c2,c3,c4,c5,c6,c7,c8) #Locus 1 L1.pairwise.columns <- matrix(3:ncol(List.elements), byrow=TRUE, ncol=2) Loc1.gamete.counts<- apply(L1.pairwise.columns , 1, function(.row){ paste(List.elements[,1:2], List.elements[,.row]) }) #Locus2 L2.pairwise.columns <- matrix(5:ncol(List.elements), byrow=TRUE, ncol=2) Loc2.gamete.counts<- apply(L2.pairwise.columns , 1, function(.row){ paste(List.elements[,3:4], List.elements[,.row]) }) #Locus3 L3.pairwise.columns <- matrix(7:ncol(List.elements), byrow=TRUE, ncol=2) Loc3.gamete.counts<- apply(L3.pairwise.columns , 1, function(.row){ paste(List.elements[,5:6], List.elements[,.row]) }) ##Creation of the List Gamete.pairs<-cbind(Loc1.gamete.counts,Loc2.gamete.counts,Loc3.gamete.counts ) Gamete.pairs Gamete.list<-list(1,2,3,4,5,6) for (i in 1:Pairwise){ Gamete.list[[i]]<-table(Gamete.pairs[,i]) } Gamete.list #### Gamete Frequency list.sample<-list(1,2,3,4,5,6) for (j in 1:Pairwise){ list.sample[[j]]<- Gamete.list[[j]]/(2*Genetic.Sample.Size) } ######## Here is the Sample List list.sample # I would like to have a flexible way to turn all six element in my list # into separate data frames so i can do some calculations # the only way i can figure out how to do this is "one by one" in very clunky fashion. # here is an example of my code sample.df1 <-data.frame(list.sample[[1]]) sample.df2 <-data.frame(list.sample[[2]]) sample.df3 <-data.frame(list.sample[[3]]) sample.df4 <-data.frame(list.sample[[4]]) sample.df5 <-data.frame(list.sample[[5]]) sample.df6 <-data.frame(list.sample[[6]]) sample.df1 sample.df2 sample.df3 sample.df4 sample.df5 sample.df6 # In the future i will have up to 1,200 of these small dataframes to create. # is there a way to loop through the list and create many small data frames?? # or perhaps make each of the list elements the same length and create one large data frame?? # any help or ideas would be greatly appreciated # thanks in advance Luke Neraas lukasneraas.r@gmail.com University of Alaska Fairbanks School of Fisheries and Ocean Sciences 11120 Glacier Highway UAF Fisheries Division Juneau, AK 99801 [[alternative HTML version deleted]]
jim holtman
2007-Sep-27 23:44 UTC
[R] create data frame(s) from a list with different numbers of rows
Instead of: sample.df1 <-data.frame(list.sample[[1]]) sample.df2 <-data.frame(list.sample[[2]]) sample.df3 <-data.frame(list.sample[[3]]) sample.df4 <-data.frame(list.sample[[4]]) sample.df5 <-data.frame(list.sample[[5]]) sample.df6 <-data.frame(list.sample[[6]]) use 'lapply' to create a list of dataframe:> lapply(list.sample, data.frame)[[1]] Var1 Freq 1 1 1 1 0.5 1 3 1 3 0.5 1 4 1 4 0.5 2 1 2 1 0.5 2 2 2 2 0.5 2 3 2 3 0.5 2 4 2 4 1.0 3 2 3 2 1.5 3 3 3 3 0.5 ........... You will have a list of 6 dataframes that you can then use. On 9/27/07, Luke Neraas <lukasneraas.r at gmail.com> wrote:> # Hello, > > > # I have a list with 6 categories and with different numbers of rows. > # I would like to change each of them into a unique data frame in order to > match > # values with other data frames and perform some calculations. > # Or I could make each category or list element have the same number of rows > and create one large data.frame. > # below is a creation of a sample list > # I apologize for the length in creating the list it is the only way i could > figure > # out how to convey my puzzle. If you scroll down you will find it as " > list.sample." > > > Loci<-4 > Pairwise<- (Loci*(Loci-1))/2 > > #Creation of list elements > > c1<- c(1,4,3,2,4,1,3,2,4,3) > c2<- c(2,4,3,4,2,3,4,1,3,2) > c3<- c(1,3,2,4,4,3,4,4,2,2) > c4<- c(2,3,2,3,1,3,2,4,4,3) > c5<- c(1,2,1,1,2,2,3,3,2,1) > c6<- c(3,2,4,3,1,1,2,3,3,4) > c7<- c(1,2,1,2,3,2,3,2,1,2) > c8<- c(1,2,2,3,2,3,3,4,1,2) > > List.elements<-cbind(c1,c2,c3,c4,c5,c6,c7,c8) > > > #Locus 1 > L1.pairwise.columns <- matrix(3:ncol(List.elements), byrow=TRUE, ncol=2) > > Loc1.gamete.counts<- apply(L1.pairwise.columns , 1, function(.row){ > paste(List.elements[,1:2], List.elements[,.row]) > }) > #Locus2 > L2.pairwise.columns <- matrix(5:ncol(List.elements), byrow=TRUE, ncol=2) > > Loc2.gamete.counts<- apply(L2.pairwise.columns , 1, function(.row){ > paste(List.elements[,3:4], List.elements[,.row]) > }) > #Locus3 > L3.pairwise.columns <- matrix(7:ncol(List.elements), byrow=TRUE, ncol=2) > > Loc3.gamete.counts<- apply(L3.pairwise.columns , 1, function(.row){ > paste(List.elements[,5:6], List.elements[,.row]) > }) > ##Creation of the List > > Gamete.pairs<-cbind(Loc1.gamete.counts,Loc2.gamete.counts,Loc3.gamete.counts > ) > Gamete.pairs > > Gamete.list<-list(1,2,3,4,5,6) > > for (i in 1:Pairwise){ > Gamete.list[[i]]<-table(Gamete.pairs[,i]) > } > Gamete.list > > #### Gamete Frequency > > list.sample<-list(1,2,3,4,5,6) > > for (j in 1:Pairwise){ > list.sample[[j]]<- Gamete.list[[j]]/(2*Genetic.Sample.Size) > } > > ######## Here is the Sample List > > list.sample > > > # I would like to have a flexible way to turn all six element in my list > # into separate data frames so i can do some calculations > # the only way i can figure out how to do this is "one by one" in very > clunky fashion. > # here is an example of my code > > sample.df1 <-data.frame(list.sample[[1]]) > sample.df2 <-data.frame(list.sample[[2]]) > sample.df3 <-data.frame(list.sample[[3]]) > sample.df4 <-data.frame(list.sample[[4]]) > sample.df5 <-data.frame(list.sample[[5]]) > sample.df6 <-data.frame(list.sample[[6]]) > > > sample.df1 > sample.df2 > sample.df3 > sample.df4 > sample.df5 > sample.df6 > > # In the future i will have up to 1,200 of these small dataframes to create. > # is there a way to loop through the list and create many small data > frames?? > # or perhaps make each of the list elements the same length and create one > large data frame?? > > # any help or ideas would be greatly appreciated > > # thanks in advance > > Luke Neraas > > lukasneraas.r at gmail.com > > University of Alaska Fairbanks > School of Fisheries and Ocean Sciences > 11120 Glacier Highway > UAF Fisheries Division > Juneau, AK 99801 > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve?
jim holtman
2007-Sep-28 00:12 UTC
[R] create data frame(s) from a list with different numbers of rows
Here is (I think) a shorter version of your code that is generic in that it will handle a matrix of any number of columns: #Creation of list elements c1<- c(1,4,3,2,4,1,3,2,4,3) c2<- c(2,4,3,4,2,3,4,1,3,2) c3<- c(1,3,2,4,4,3,4,4,2,2) c4<- c(2,3,2,3,1,3,2,4,4,3) c5<- c(1,2,1,1,2,2,3,3,2,1) c6<- c(3,2,4,3,1,1,2,3,3,4) c7<- c(1,2,1,2,3,2,3,2,1,2) c8<- c(1,2,2,3,2,3,3,4,1,2) List.elements<-cbind(c1,c2,c3,c4,c5,c6,c7,c8) # create counts for any size matrix Gamete.pairs <- lapply(seq(3, ncol(List.elements), 2), function(.col){ .pairwise <- matrix(.col:ncol(List.elements), byrow=TRUE, ncol=2) apply(.pairwise, 1, function(.row){ paste(List.elements[, 1:2], List.elements[,.row]) }) }) # now create a matrix of the results Gamete.pairs <- do.call('cbind', Gamete.pairs) Gamete.pairs # do table on the matrix Gamete.list <- apply(Gamete.pairs, 2, table) Gamete.list # generate frequencies list.sample <- lapply(Gamete.list, function(.table){ .table / sum(.table) # not exactly sure if this matches your, # but 'Genetic.Sample.Size' was missing }) # now put back into dataframes myDF <- lapply(list.sample, data.frame) myDF On 9/27/07, Luke Neraas <lukasneraas.r at gmail.com> wrote:> # Hello, > > > # I have a list with 6 categories and with different numbers of rows. > # I would like to change each of them into a unique data frame in order to > match > # values with other data frames and perform some calculations. > # Or I could make each category or list element have the same number of rows > and create one large data.frame. > # below is a creation of a sample list > # I apologize for the length in creating the list it is the only way i could > figure > # out how to convey my puzzle. If you scroll down you will find it as " > list.sample." > > > Loci<-4 > Pairwise<- (Loci*(Loci-1))/2 > > #Creation of list elements > > c1<- c(1,4,3,2,4,1,3,2,4,3) > c2<- c(2,4,3,4,2,3,4,1,3,2) > c3<- c(1,3,2,4,4,3,4,4,2,2) > c4<- c(2,3,2,3,1,3,2,4,4,3) > c5<- c(1,2,1,1,2,2,3,3,2,1) > c6<- c(3,2,4,3,1,1,2,3,3,4) > c7<- c(1,2,1,2,3,2,3,2,1,2) > c8<- c(1,2,2,3,2,3,3,4,1,2) > > List.elements<-cbind(c1,c2,c3,c4,c5,c6,c7,c8) > > > #Locus 1 > L1.pairwise.columns <- matrix(3:ncol(List.elements), byrow=TRUE, ncol=2) > > Loc1.gamete.counts<- apply(L1.pairwise.columns , 1, function(.row){ > paste(List.elements[,1:2], List.elements[,.row]) > }) > #Locus2 > L2.pairwise.columns <- matrix(5:ncol(List.elements), byrow=TRUE, ncol=2) > > Loc2.gamete.counts<- apply(L2.pairwise.columns , 1, function(.row){ > paste(List.elements[,3:4], List.elements[,.row]) > }) > #Locus3 > L3.pairwise.columns <- matrix(7:ncol(List.elements), byrow=TRUE, ncol=2) > > Loc3.gamete.counts<- apply(L3.pairwise.columns , 1, function(.row){ > paste(List.elements[,5:6], List.elements[,.row]) > }) > ##Creation of the List > > Gamete.pairs<-cbind(Loc1.gamete.counts,Loc2.gamete.counts,Loc3.gamete.counts > ) > Gamete.pairs > > Gamete.list<-list(1,2,3,4,5,6) > > for (i in 1:Pairwise){ > Gamete.list[[i]]<-table(Gamete.pairs[,i]) > } > Gamete.list > > #### Gamete Frequency > > list.sample<-list(1,2,3,4,5,6) > > for (j in 1:Pairwise){ > list.sample[[j]]<- Gamete.list[[j]]/(2*Genetic.Sample.Size) > } > > ######## Here is the Sample List > > list.sample > > > # I would like to have a flexible way to turn all six element in my list > # into separate data frames so i can do some calculations > # the only way i can figure out how to do this is "one by one" in very > clunky fashion. > # here is an example of my code > > sample.df1 <-data.frame(list.sample[[1]]) > sample.df2 <-data.frame(list.sample[[2]]) > sample.df3 <-data.frame(list.sample[[3]]) > sample.df4 <-data.frame(list.sample[[4]]) > sample.df5 <-data.frame(list.sample[[5]]) > sample.df6 <-data.frame(list.sample[[6]]) > > > sample.df1 > sample.df2 > sample.df3 > sample.df4 > sample.df5 > sample.df6 > > # In the future i will have up to 1,200 of these small dataframes to create. > # is there a way to loop through the list and create many small data > frames?? > # or perhaps make each of the list elements the same length and create one > large data frame?? > > # any help or ideas would be greatly appreciated > > # thanks in advance > > Luke Neraas > > lukasneraas.r at gmail.com > > University of Alaska Fairbanks > School of Fisheries and Ocean Sciences > 11120 Glacier Highway > UAF Fisheries Division > Juneau, AK 99801 > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve?