Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding frequency of range of numbers in Mathematica

Given a list of numbers in Mathematica, how would I extract from that list the total number of numbers between numbers a and b that I specify?

like image 245
wrongusername Avatar asked May 17 '11 05:05

wrongusername


3 Answers

The most direct way is simply:

Count[data, x_ /; a <= x <= b]

There are however much faster ways for most data, this one thanks to Carl Woll:

Tr@Unitize@Clip[data, {a, b}, {0, 0}]

Carl Woll's method is particularly fast, but as yoda pointed out, it fails if your list contains zeros, and your range also straddles zero. Here is another method from Kevin J. McCann that handles this case, and is still very fast:

Tr@UnitStep[(data - a)*(b - data)]

As a pure function [data, a, b]:

Tr@UnitStep[(#-#2)*(#3-#)]&
like image 103
Mr.Wizard Avatar answered Sep 20 '22 11:09

Mr.Wizard


Here is one approach that you can try:

freq[a_, b_, list_] := Total@Boole@Cases[list, x_ :> a <= x <= b]
lst = RandomInteger[10, 20]
Out = {6, 1, 1, 6, 3, 1, 10, 0, 2, 10, 3, 5, 9, 1, 5, 5, 3, 8, 2, 3}

freq[3, 6, lst]
Out = 9

An alternate approach using IntervalMemberQ is

freq[a_, b_, list_] :=
 Total@Boole@IntervalMemberQ[Interval[{a, b}], list]
like image 37
abcd Avatar answered Sep 19 '22 11:09

abcd


another approach is

NumberOfNumbers[lst_?ListQ, lwr_?NumberQ, upr_?NumberQ] := 
 Length@Select[lst, (lwr <= # <= upr) &]

D

like image 37
dwa Avatar answered Sep 21 '22 11:09

dwa