How to generate bin frequency table in R?

前端 未结 4 1930
暖寄归人
暖寄归人 2020-12-15 10:04

How can i bin data of size 0.1 for the following example.

x<-c(0.01,0.34,0.45,0.67,0.89,0.12,0.34,0.45,0.23,0.45,0.34,0.32,0.45,0.21,0.55,0.66,0.99,0.23,.         


        
相关标签:
4条回答
  • 2020-12-15 10:33

    Regarding @akrun solution, I would post something usefull from the documentation ?cut, in case:

    Note

    Instead of table(cut(x, br)), hist(x, br, plot = FALSE) is more efficient and less memory hungry.

    So, in case of lots of data, I would rather opt for:

    br = seq(0,1,by=0.1)
    
    ranges = paste(head(br,-1), br[-1], sep=" - ")
    freq   = hist(x, breaks=br, include.lowest=TRUE, plot=FALSE)
    
    data.frame(range = ranges, frequency = freq$counts)
    
    #       range frequency
    #1    0 - 0.1         2
    #2  0.1 - 0.2         1
    #3  0.2 - 0.3         3
    #4  0.3 - 0.4         5
    #5  0.4 - 0.5         4
    #6  0.5 - 0.6         1
    #7  0.6 - 0.7         2
    #8  0.7 - 0.8         0
    #10   0.9 - 1         1
    
    0 讨论(0)
  • 2020-12-15 10:39

    try

     as.data.frame(table(cut(x, breaks=seq(0,1, by=0.1))))
    
    0 讨论(0)
  • 2020-12-15 10:49

    Building on @Colonel Beauvel's answer,

    A bin frequency table function. (Histogram table).

    binFreqTable <- function(x, bins) {
    
      freq = hist(x, breaks=bins, include.lowest=TRUE, plot=FALSE)
    
      ranges = paste(head(freq$breaks,-1), freq$breaks[-1], sep=" - ")
    
      return(data.frame(range = ranges, frequency = freq$counts))
    
    }
    

    Examples:

    > binFreqTable(x,c(0,.3,.6,1))
    #      range frequency
    #1   0 - 0.3         6
    #2 0.3 - 0.6        10
    #3   0.6 - 1         4
    
    > binFreqTable(x,5)
    #      range frequency
    #1   0 - 0.2         3
    #2 0.2 - 0.4         8
    #3 0.4 - 0.6         5
    #4 0.6 - 0.8         2
    #5   0.8 - 1         2
    
    > binFreqTable(x,seq(0,1,by=0.1))
    #       range frequency
    #1    0 - 0.1         2
    #2  0.1 - 0.2         1
    #3  0.2 - 0.3         3
    #4  0.3 - 0.4         5
    #5  0.4 - 0.5         4
    #6  0.5 - 0.6         1
    #7  0.6 - 0.7         2
    #8  0.7 - 0.8         0
    #9  0.8 - 0.9         1
    #10   0.9 - 1         1
    
    0 讨论(0)
  • 2020-12-15 10:50

    Akrun's answer was good but didn't quite get me there for formatting.

    x<-c(0.01,0.34,0.45,0.67,0.89,0.12,0.34,0.45,0.23,0.45,0.34,0.32,0.45,0.21,0.55,0.66,0.99,0.23,.012,0.34)
    
    cuts<-cut(x, breaks=seq(0,1, by=0.1))
    counts<-c(t(table(cuts)))
    
    #Here's the important part for me, formatting the cuts for display in the data frame:
    
    labs <- levels(cuts)
    lable_matrix<-cbind(lower = as.numeric( sub("\\((.+),.*", "\\1", labs) ),
      upper = as.numeric( sub("[^,]*,([^]]*)\\]", "\\1", labs) ))
    
    cut_frame<-data.frame(lable_matrix,counts)
    
    #   lower upper counts  
    #1    0.0   0.1      2  
    #2    0.1   0.2      1  
    #3    0.2   0.3      3  
    #4    0.3   0.4      5  
    #5    0.4   0.5      4  
    #6    0.5   0.6      1  
    #7    0.6   0.7      2  
    #8    0.7   0.8      0  
    #9    0.8   0.9      1  
    #10   0.9   1.0      1  
    
    0 讨论(0)
提交回复
热议问题