freq function

D

Dirk Nachbar

Here is a function which takes any list and creates a freq table,
which can be printed unsorted, sorted by cases or items. It's supposed
to mirror the proc freq in SAS.

Dirk

def freq(seq,order='unsorted',prin=True):
#order can be unsorted, cases, items

freq={}
for s in seq:
if s in freq:
freq+=1
else:
freq=1
if prin==True:
print 'Items=',len(seq),'Cases=',len(freq)
print '------------------------'
if order=='unsorted':
for k in freq.keys():
print k,freq[k],float(freq[k])/len(seq)
elif order=='cases':
#http://blog.client9.com/2007/11/sorting-python-dict-by-
value.html
freq2=sorted(freq.iteritems(), key=lambda (k,v):
(v,k),reverse=True)
for f in freq2:
print f[0],f[1],float(f[1])/len(seq)
elif order=='items':
for k in sorted(freq.iterkeys()):
print k,freq[k],float(freq[k])/len(seq)
print '------------------------'
return freq

#test

import random

rand=[]
for i in range(10000):
rand.append(str(int(100*random.random())))

fr=freq(rand)
fr2=freq(rand,order='items')
fr2=freq(rand,order='cases')
 
C

Chris Rebert

Here is a function which takes any list and creates a freq table,
which can be printed unsorted, sorted by cases or items. It's supposed
to mirror the proc freq in SAS.

Dirk
   freq={}
   for s in seq:
       if s in freq:
           freq+=1
       else:
           freq=1


The above code can be replaced with this:
 freq = {}
 for s in seq:
          freq = freq.get(s,0) + 1


Which can be further replaced by:

from collections import Counter
freq = Counter(seq)

Using collections.defaultdict is another possibility if one doesn't
have Python 2.7.

Cheers,
Chris
 
P

Peter Otten

Dirk said:
Here is a function which takes any list and creates a freq table,
which can be printed unsorted, sorted by cases or items. It's supposed
to mirror the proc freq in SAS.

Dirk

def freq(seq,order='unsorted',prin=True):
#order can be unsorted, cases, items

freq={}
for s in seq:
if s in freq:
freq+=1
else:
freq=1
if prin==True:
print 'Items=',len(seq),'Cases=',len(freq)
print '------------------------'
if order=='unsorted':
for k in freq.keys():
print k,freq[k],float(freq[k])/len(seq)
elif order=='cases':
#http://blog.client9.com/2007/11/sorting-python-dict-by-
value.html
freq2=sorted(freq.iteritems(), key=lambda (k,v):
(v,k),reverse=True)


Sorting in two steps gives a slightly better result when there are items
with equal keys. Compare
[('d', 2), ('a', 2), ('c', 1), ('b', 1)]

with
[('a', 2), ('d', 2), ('b', 1), ('c', 1)]

Here the keys within groups of equal frequency are in normal instead of
reversed order.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top