Split a large dataframe into a list of data frames based on common value in column

后端 未结 3 982
离开以前
离开以前 2020-11-22 07:52

I have a data frame with 10 columns, collecting actions of \"users\", where one of the columns contains an ID (not unique, identifying user)(column 10). the length of the da

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-22 08:48

    You can just as easily access each element in the list using e.g. path[[1]]. You can't put a set of matrices into an atomic vector and access each element. A matrix is an atomic vector with dimension attributes. I would use the list structure returned by split, it's what it was designed for. Each list element can hold data of different types and sizes so it's very versatile and you can use *apply functions to further operate on each element in the list. Example below.

    #  For reproducibile data
    set.seed(1)
    
    #  Make some data
    userid <- rep(1:2,times=4)
    data1 <- replicate(8 , paste( sample(letters , 3 ) , collapse = "" ) )
    data2 <- sample(10,8)
    df <- data.frame( userid , data1 , data2 )
    
    #  Split on userid
    out <- split( df , f = df$userid )
    #$`1`
    #  userid data1 data2
    #1      1   gjn     3
    #3      1   yqp     1
    #5      1   rjs     6
    #7      1   jtw     5
    
    #$`2`
    #  userid data1 data2
    #2      2   xfv     4
    #4      2   bfe    10
    #6      2   mrx     2
    #8      2   fqd     9
    

    Access each element using the [[ operator like this:

    out[[1]]
    #  userid data1 data2
    #1      1   gjn     3
    #3      1   yqp     1
    #5      1   rjs     6
    #7      1   jtw     5
    

    Or use an *apply function to do further operations on each list element. For instance, to take the mean of the data2 column you could use sapply like this:

    sapply( out , function(x) mean( x$data2 ) )
    #   1    2 
    #3.75 6.25 
    

提交回复
热议问题