Flattening a delimited composite column

后端 未结 3 893
一整个雨季
一整个雨季 2020-12-07 06:01

I got a data frame in R where one of the fields is composite (delimited). Here\'s an example of what I got:

users=c(1,2,3)
items=c(\"23 77 49\", \"10 18 28\"         


        
3条回答
  •  抹茶落季
    2020-12-07 06:30

    items <- strsplit(df$items, " ")
    data.frame(user = rep(df$users, sapply(items, length)), item = unlist(items))
    
    ##   user item                                                                                                                                                                                                                                
    ## 1    1   23                                                                                                                                                                                                                                
    ## 2    1   77                                                                                                                                                                                                                                
    ## 3    1   49                                                                                                                                                                                                                                
    ## 4    2   10                                                                                                                                                                                                                                
    ## 5    2   18                                                                                                                                                                                                                                
    ## 6    2   28                                                                                                                                                                                                                                
    ## 7    3   20                                                                                                                                                                                                                                
    ## 8    3   31                                                                                                                                                                                                                                
    ## 9    3   84  
    

    or

    library(data.table)
    
    DT <- data.table(df)    
    DT[, list(item = unlist(strsplit(items, " "))), by = users]
    
    ##    users item                                                                                                                                                                                                                              
    ## 1:     1   23                                                                                                                                                                                                                              
    ## 2:     1   77                                                                                                                                                                                                                              
    ## 3:     1   49                                                                                                                                                                                                                              
    ## 4:     2   10                                                                                                                                                                                                                              
    ## 5:     2   18                                                                                                                                                                                                                              
    ## 6:     2   28                                                                                                                                                                                                                              
    ## 7:     3   20                                                                                                                                                                                                                              
    ## 8:     3   31                                                                                                                                                                                                                              
    ## 9:     3   84 
    

提交回复
热议问题