Dear List, I have a list containing data frames of various numbers of rows. I need to remove any data frame that has less than 3 rows. For example: df1<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) df2<-data.frame(letter=c("A","B"),number=c(1,2)) df3<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) df4<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) lst<-list(df1,df2,df3,df4) How can I determine that the second object (df2) has less than 3 rows and remove it from the list? Thanks! Tim Tim Clark Department of Zoology University of Hawaii
Try these: sapply(lst, nrow) # get row numbers which(sapply(lst, nrow) < 3) # get the index of rows which has less than 3 rows lst <- lst[-which(sapply(lst, nrow) < 3)] # remove the rows from the list On Sun, Nov 29, 2009 at 4:36 PM, Tim Clark <mudiver1200 at yahoo.com> wrote:> Dear List, > > I have a list containing data frames of various numbers of rows. ?I need to remove any data frame that has less than 3 rows. ?For example: > > df1<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > df2<-data.frame(letter=c("A","B"),number=c(1,2)) > df3<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > df4<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > > lst<-list(df1,df2,df3,df4) > > How can I determine that the second object (df2) has less than 3 rows and remove it from the list? > > Thanks! > > Tim > > > > > Tim Clark > Department of Zoology > University of Hawaii > > ______________________________________________ > 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. >
Linlin, Thanks! That works great! Tim Tim Clark Department of Zoology University of Hawaii --- On Sat, 11/28/09, Linlin Yan <yanlinlin82 at gmail.com> wrote:> From: Linlin Yan <yanlinlin82 at gmail.com> > Subject: Re: [R] Removing objects from a list based on nrow > To: "Tim Clark" <mudiver1200 at yahoo.com> > Cc: r-help at r-project.org > Date: Saturday, November 28, 2009, 10:43 PM > Try these: > sapply(lst, nrow) # get row numbers > which(sapply(lst, nrow) < 3) # get the index of rows > which has less than 3 rows > lst <- lst[-which(sapply(lst, nrow) < 3)] # remove > the rows from the list > > On Sun, Nov 29, 2009 at 4:36 PM, Tim Clark <mudiver1200 at yahoo.com> > wrote: > > Dear List, > > > > I have a list containing data frames of various > numbers of rows. ?I need to remove any data frame that has > less than 3 rows. ?For example: > > > > > df1<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > > df2<-data.frame(letter=c("A","B"),number=c(1,2)) > > > df3<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > > > df4<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > > > > lst<-list(df1,df2,df3,df4) > > > > How can I determine that the second object (df2) has > less than 3 rows and remove it from the list? > > > > Thanks! > > > > Tim > > > > > > > > > > Tim Clark > > Department of Zoology > > University of Hawaii > > > > ______________________________________________ > > 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. > > >
One thing to be careful of is if no dataframe have less than 3 rows:> df1<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > df2<-data.frame(letter=c("A","B"),number=c(1,2)) > df3<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > df4<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) > > lst<-list(df1,df3,df4) > lst[[1]] letter number 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 [[2]] letter number 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 [[3]] letter number 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5> lst[-which(sapply(lst, nrow) < 3)]list()>Notice the list is now empty. Instead use:> lst[sapply(lst, nrow) >=3][[1]] letter number 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 [[2]] letter number 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 [[3]] letter number 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 On Sun, Nov 29, 2009 at 3:43 AM, Linlin Yan <yanlinlin82 at gmail.com> wrote:> Try these: > sapply(lst, nrow) # get row numbers > which(sapply(lst, nrow) < 3) # get the index of rows which has less than 3 rows > lst <- lst[-which(sapply(lst, nrow) < 3)] # remove the rows from the list > > On Sun, Nov 29, 2009 at 4:36 PM, Tim Clark <mudiver1200 at yahoo.com> wrote: >> Dear List, >> >> I have a list containing data frames of various numbers of rows. ?I need to remove any data frame that has less than 3 rows. ?For example: >> >> df1<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) >> df2<-data.frame(letter=c("A","B"),number=c(1,2)) >> df3<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) >> df4<-data.frame(letter=c("A","B","C","D","E"),number=c(1,2,3,4,5)) >> >> lst<-list(df1,df2,df3,df4) >> >> How can I determine that the second object (df2) has less than 3 rows and remove it from the list? >> >> Thanks! >> >> Tim >> >> >> >> >> Tim Clark >> Department of Zoology >> University of Hawaii >> >> ______________________________________________ >> 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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve?