Skip to content

Removing objects from a list based on nrow

6 messages · Linlin Yan, Tim Clark, jim holtman

#
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:
#
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:

            
#
One thing to be careful of is if no dataframe have less than 3 rows:
[[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
list()
Notice the list is now empty.  Instead use:
[[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:

  
    
#
Thank Jim! You are right. I didn't notice the case of none of rows
match the condition.
On Sun, Nov 29, 2009 at 10:10 PM, jim holtman <jholtman at gmail.com> wrote:
#
Jim,

Good catch!  I know in my current problem there are objects with less than 3 rows, but will make sure to modify the function for future use.

Thanks,

Tim


Tim Clark
Department of Zoology 
University of Hawaii
--- On Sun, 11/29/09, Linlin Yan <yanlinlin82 at gmail.com> wrote: