(define (group-by xs f)
  (reverse (foldl (lambda (x l)
                    (let ((val  (cdr x)))
                      (if (null? l)
                          (list (list val))
                          (let ((prev (caar l)))
                            (if (= prev val)
                                (cons (append (car l) (list val)) (cdr l))
                                (cons (list val) l))))))
                  '()
                  (sort (map (lambda (x) (cons x (f x))) xs) (lambda (x y) (< (cdr x) (cdr y)))))))

(define f (lambda(x) (/ 1 x)))
(group-by (list 2 5 4 5 8 2 8) f)