Условный подсчет элементов в столбце электронной таблицы в режиме орг. - PullRequest
6 голосов
/ 07 февраля 2012

Я использую emacs-calc через электронную таблицу в режиме org и хочу подсчитать количество значений в столбце, которые превышают определенное значение (скажем, 10).

В настоящее время я использую emacs-calc для вычислений, но если в emacs-lisp есть решение, это будет очень кстати!

Я знаю, что vcount будет подсчитывать количество значений в векторе, но это будет считать все значения в этом векторе. Как добавить условие, чтобы учитывались только значения> 10?

Другими словами, я хотел бы, чтобы таинственная функция возвращала 2 в таком случае:

mysterious_function([2,14,11,3,9,1])

Ответы [ 4 ]

4 голосов
/ 08 февраля 2012

Танки все за ваши ответы.Я нашел решение, используя emacs-calc, вдохновленное предложением Чоробы.

vcount(map(<if(gt(#1,10), 1, [])>, [15,2,5,13]))

Итак, для обработки столбца в электронной таблице режима org я могу сделать, например:

vcount(map(<if(gt(#1,10), 1, [])>, @I..@II))

Функция map используется для применения функции (в данном случае анонимной) к каждому элементу вектора.Если элемент больше 10, мы ставим 1, иначе - пустой вектор.

4 голосов
/ 07 февраля 2012

Как можно добавить условие, чтобы учитывались только значения> 10?

Другими словами, я бы хотел таинственную функцию, которая бы возвращала 2 в таком случае:

mysterious_function ([2,14,10,3,9,1])

Э-э, у вас есть только одно значение больше 10 в этом списке - вы имеете в виду> = 10?

В любом случае, я не знаю о таблицах в режиме org, но вот как это сделать в Emacs Lisp:

(defun mysterious-function (vector)
  (length
   (remove-if-not #'(lambda (n)
              (>= n 10))
          (append vector nil))))
3 голосов
/ 07 февраля 2012

Вы также можете создать дополнительный столбец, который будет содержать

if($2>10,1,string(""))

, а затем просто применить vcount к этому столбцу.

2 голосов
/ 03 марта 2015

Поскольку логические операции производят 1 для true и 0 для false, мы можем просто sum проверить:

vsum(map(<gt(#1,10)>,@I..@II))
...