Dear R users, I'm starting to use 'apply' functions rather than for loops in R, and sometimes the output is a bit different than what I want. In this case, the command was tapply(myvector,myindex,cumsum) And the output was something like this: $`SNRL1 Core 120` [1] 2.8546 4.0778 5.2983 6.3863 7.5141 8.5498 9.5839 10.6933 $`SNRL1 Core 230` [1] 7.6810 8.7648 9.8382 10.8903 11.9840 13.0541 14.1132 15.1657 $`VAL 1.1.NA.na30` [1] 22.0840 30.3001 35.2505 42.8085 48.5220 52.0604 57.9428 61.4930 64.4550 67.3543 69.8435 72.9508 74.4730 76.3104 $`VAL 1.2.NA.na15` [1] 33.8895 38.7440 41.0536 44.1581 46.4891 48.3130 51.0973 52.9241 54.6404 56.1265 57.5064 59.0745 $`VAL 1.2.NA.na30` [1] 6.6408 10.6838 13.8328 15.5435 18.3037 20.3315 22.8817 24.4481 26.4106 27.6658 29.6455 30.8490 31.8680 $`VAL 1.3.NA.na10` [1] 4.8198 7.1274 8.9536 11.5954 14.0845 15.5116 16.9462 18.1269 19.3453 20.5723 21.7122 22.8643 $`VAL 1.3.NA.na20` [1] 5.7382 8.2056 9.4489 10.8225 12.3497 13.6879 15.1077 16.3229 , That's fine, but I need the output as a dataframe. I'm not even sure what to call this list, but it has multiple entries for each item. Forgive the fact that I don't have the data for you to use, I'm wondering if anyone knows about a pre-existing function that will allow be to turn the above list form into a dataframe. Thanks *Ben Caldwell* [[alternative HTML version deleted]]
On Mon, Oct 8, 2012 at 10:49 PM, Benjamin Caldwell <btcaldwell at berkeley.edu> wrote:> Dear R users, > > I'm starting to use 'apply' functions rather than for loops in R, and > sometimes the output is a bit different than what I want. In this case, the > command was > > > tapply(myvector,myindex,cumsum) > > And the output was something like this: > > $`SNRL1 Core 120` > [1] 2.8546 4.0778 5.2983 6.3863 7.5141 8.5498 9.5839 10.6933 > > $`SNRL1 Core 230` > [1] 7.6810 8.7648 9.8382 10.8903 11.9840 13.0541 14.1132 15.1657 > > $`VAL 1.1.NA.na30` > [1] 22.0840 30.3001 35.2505 42.8085 48.5220 52.0604 57.9428 61.4930 > 64.4550 67.3543 69.8435 72.9508 74.4730 76.3104 > > $`VAL 1.2.NA.na15` > [1] 33.8895 38.7440 41.0536 44.1581 46.4891 48.3130 51.0973 52.9241 > 54.6404 56.1265 57.5064 59.0745 > > $`VAL 1.2.NA.na30` > [1] 6.6408 10.6838 13.8328 15.5435 18.3037 20.3315 22.8817 24.4481 > 26.4106 27.6658 29.6455 30.8490 31.8680 > > $`VAL 1.3.NA.na10` > [1] 4.8198 7.1274 8.9536 11.5954 14.0845 15.5116 16.9462 18.1269 > 19.3453 20.5723 21.7122 22.8643 > > $`VAL 1.3.NA.na20` > [1] 5.7382 8.2056 9.4489 10.8225 12.3497 13.6879 15.1077 16.3229 > > , > That's fine, but I need the output as a dataframe. I'm not even sure what > to call this list, but it has multiple entries for each item. > > Forgive the fact that I don't have the data for you to use, I'm wondering > if anyone knows about a pre-existing function that will allow be to turn > the above list form into a dataframe. Thanks > > > *Ben Caldwell* >Hi Ben, In the future, you can get some good advice for making reproducible examples here: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example In your case, I think something like do.call(data.frame, LIST) will work. Take a look at ?do.call for an explanation of the magic. Cheers, Michael
Hi, Your output suggests that the list elements have unequal lengths.? The empty spaces will be occupied by NAs.? I am using the first three list elements from the tapply() output: list1<-list(c(2.8546, 4.0778,? 5.2983,? 6.3863,? 7.5141,? 8.5498,? 9.5839, 10.6933),c(7.6810,? 8.7648,? 9.8382, 10.8903, 11.9840, 13.0541, 14.1132, 15.1657),c(22.0840, 30.3001, 35.2505, 42.8085, 48.5220, 52.0604, 57.9428, 61.4930, ?64.4550, 67.3543, 69.8435, 72.9508, 74.4730, 76.3104)) ?names(list1)<-c("SNRL1Core120","SNRL1Core230","VAL1.1.1NA.na30") ?fun1<-function(x){ ?na.pad<-function(y,len){ ?c(y,rep(NA,len-length(y))) ?} ?maxlen<-max(sapply(x,length)) ?do.call(data.frame,lapply(x,na.pad,len=maxlen)) ?} ?fun1(list1) A.K. ----- Original Message ----- From: Benjamin Caldwell <btcaldwell at berkeley.edu> To: r-help <r-help at r-project.org> Cc: Sent: Monday, October 8, 2012 5:49 PM Subject: [R] turn list into dataframe Dear R users, I'm starting to use 'apply' functions rather than for loops in R, and sometimes the output is a bit different than what I want. In this case, the command was tapply(myvector,myindex,cumsum) And the output was something like this: $`SNRL1 Core 120` [1]? 2.8546? 4.0778? 5.2983? 6.3863? 7.5141? 8.5498? 9.5839 10.6933 $`SNRL1 Core 230` [1]? 7.6810? 8.7648? 9.8382 10.8903 11.9840 13.0541 14.1132 15.1657 $`VAL 1.1.NA.na30` [1] 22.0840 30.3001 35.2505 42.8085 48.5220 52.0604 57.9428 61.4930 64.4550 67.3543 69.8435 72.9508 74.4730 76.3104 $`VAL 1.2.NA.na15` [1] 33.8895 38.7440 41.0536 44.1581 46.4891 48.3130 51.0973 52.9241 54.6404 56.1265 57.5064 59.0745 $`VAL 1.2.NA.na30` [1]? 6.6408 10.6838 13.8328 15.5435 18.3037 20.3315 22.8817 24.4481 26.4106 27.6658 29.6455 30.8490 31.8680 $`VAL 1.3.NA.na10` [1]? 4.8198? 7.1274? 8.9536 11.5954 14.0845 15.5116 16.9462 18.1269 19.3453 20.5723 21.7122 22.8643 $`VAL 1.3.NA.na20` [1]? 5.7382? 8.2056? 9.4489 10.8225 12.3497 13.6879 15.1077 16.3229 , That's fine, but I need the output as a dataframe. I'm not even sure what to call this list, but it has multiple entries for each item. Forgive the fact that I don't have the data for you to use, I'm wondering if anyone knows about a pre-existing function that will allow be to turn the above list form into a dataframe. Thanks *Ben Caldwell* ??? [[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.
Hi Purna, From your reply, I guess you intend to email the OP (original poster), but somehow you got confused with the email ids.? When you send reply, please cc: to r-help. The OP didn't gave much details about the dataset, but only the output generated from tapply().? Output shows that the list elements are unequal in length.? If that is the case, then as.data.frame(output ) gives: list1<-list(c(2.8546, 4.0778,? 5.2983,? 6.3863,? 7.5141,? 8.5498,? 9.5839, 10.6933),c(7.6810,? 8.7648,? 9.8382, 10.8903, 11.9840, 13.0541, 14.1132, 15.1657),c(22.0840, 30.3001, 35.2505, 42.8085, 48.5220, 52.0604, 57.9428, 61.4930, +? 64.4550, 67.3543, 69.8435, 72.9508, 74.4730, 76.3104)) ? names(list1)<-c("SNRL1Core120","SNRL1Core230","VAL1.1.1NA.na30") ?as.data.frame(list1) #Error in data.frame(SNRL1Core120 = c(2.8546, 4.0778, 5.2983, 6.3863, 7.5141,? : ? #arguments imply differing number of rows: 8, 14 That was the reason I used the function. A.K. ? ----- Original Message ----- From: Purna chander <chanderbio at gmail.com> To: arun <smartpink111 at yahoo.com> Cc: Sent: Tuesday, October 9, 2012 1:52 AM Subject: Re: [R] turn list into dataframe Hi Ben, try this.. as.data.frame(tapply(myvector,myindex,cumsum)) Regards, Purna On 10/9/12, arun <smartpink111 at yahoo.com> wrote:> Hi, > > Your output suggests that the list elements have unequal lengths.? The empty > spaces will be occupied by NAs. > I am using the first three list elements from the tapply() output: > > list1<-list(c(2.8546, 4.0778,? 5.2983,? 6.3863,? 7.5141,? 8.5498,? 9.5839, > 10.6933),c(7.6810,? 8.7648,? 9.8382, 10.8903, 11.9840, 13.0541, 14.1132, > 15.1657),c(22.0840, 30.3001, 35.2505, 42.8085, 48.5220, 52.0604, 57.9428, > 61.4930, > ?64.4550, 67.3543, 69.8435, 72.9508, 74.4730, 76.3104)) > ?names(list1)<-c("SNRL1Core120","SNRL1Core230","VAL1.1.1NA.na30") > > ?fun1<-function(x){ > ?na.pad<-function(y,len){ > ?c(y,rep(NA,len-length(y))) > ?} > ?maxlen<-max(sapply(x,length)) > ?do.call(data.frame,lapply(x,na.pad,len=maxlen)) > ?} > ?fun1(list1) > A.K. > > > > > > > > ----- Original Message ----- > From: Benjamin Caldwell <btcaldwell at berkeley.edu> > To: r-help <r-help at r-project.org> > Cc: > Sent: Monday, October 8, 2012 5:49 PM > Subject: [R] turn list into dataframe > > Dear R users, > > I'm starting to use 'apply' functions rather than for loops in R, and > sometimes the output is a bit different than what I want. In this case, the > command was > > > tapply(myvector,myindex,cumsum) > > And the output was something like this: > > $`SNRL1 Core 120` > [1]? 2.8546? 4.0778? 5.2983? 6.3863? 7.5141? 8.5498? 9.5839 10.6933 > > $`SNRL1 Core 230` > [1]? 7.6810? 8.7648? 9.8382 10.8903 11.9840 13.0541 14.1132 15.1657 > > $`VAL 1.1.NA.na30` > [1] 22.0840 30.3001 35.2505 42.8085 48.5220 52.0604 57.9428 61.4930 > 64.4550 67.3543 69.8435 72.9508 74.4730 76.3104 > > $`VAL 1.2.NA.na15` > [1] 33.8895 38.7440 41.0536 44.1581 46.4891 48.3130 51.0973 52.9241 > 54.6404 56.1265 57.5064 59.0745 > > $`VAL 1.2.NA.na30` > [1]? 6.6408 10.6838 13.8328 15.5435 18.3037 20.3315 22.8817 24.4481 > 26.4106 27.6658 29.6455 30.8490 31.8680 > > $`VAL 1.3.NA.na10` > [1]? 4.8198? 7.1274? 8.9536 11.5954 14.0845 15.5116 16.9462 18.1269 > 19.3453 20.5723 21.7122 22.8643 > > $`VAL 1.3.NA.na20` > [1]? 5.7382? 8.2056? 9.4489 10.8225 12.3497 13.6879 15.1077 16.3229 > > , > That's fine, but I need the output as a dataframe. I'm not even sure what > to call this list, but it has multiple entries for each item. > > Forgive the fact that I don't have the data for you to use, I'm wondering > if anyone knows about a pre-existing function that will allow be to turn > the above list form into a dataframe. Thanks > > > *Ben Caldwell* > > ??? [[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. > > > ______________________________________________ > 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. >