Using Group_by create aggregated counts conditional on value

后端 未结 1 1315
轻奢々
轻奢々 2020-12-22 05:23

I have a data table that looks like this:

    serialno state type type2
1       100    FL    A     C
2       100    CA    A     D
3       101    CA    B              


        
相关标签:
1条回答
  • 2020-12-22 05:51

    Using:

    library(reshape2)
    recast(dat, serialno ~ value, id.var = 'serialno', fun.aggregate = length)
    

    gives:

      serialno A B C CA D FL GA NJ NY PA WA
    1      100 2 0 1  1 1  1  0  0  0  0  0
    2      101 0 1 0  1 1  0  0  0  0  0  0
    3      102 1 0 1  0 0  0  1  0  0  0  0
    4      103 1 1 2  0 0  0  0  0  0  1  1
    5      104 0 2 1  2 1  0  0  0  0  0  0
    6      105 1 1 1  0 1  0  0  1  1  0  0
    

    Or:

    library(dplyr)
    library(tidyr)
    dat %>% 
      gather(key, val, state:type2) %>% 
      group_by(serialno, val) %>% 
      tally() %>% 
      spread(val, n, fill = 0)
    

    Or:

    library(data.table)
    dcast(melt(setDT(dat), id = 1), serialno ~ value, fun.aggregate = length)
    

    Or (per @Frank's suggestion):

    res <- table(melt(dat, id="serialno")[, c("serialno","value")])
    print(res, zero.print="")
    

    Of which the last one results in:

            value
    serialno A B C CA D FL GA NJ NY PA WA
         100 2   1  1 1  1               
         101   1    1 1                  
         102 1   1          1            
         103 1 1 2                   1  1
         104   2 1  2 1                  
         105 1 1 1    1        1  1      
    
    0 讨论(0)
提交回复
热议问题