Добавление ограничений в условный запрос/операцию в Mathematica

Я использую следующую функцию для выполнения условной операции над списком:

consider[data_, conditionCOL_, conditionVAL_, listOfCol_] :=
  Select[data, (#[[conditionCOL]] == conditionVAL) &][[All, listOfCol]]

Учитывая следующий пример:

dalist = Join[Tuples[Range[4], 2]\[Transpose], {Range[16], Range[17, 32, 1]}
         ]\[Transpose];

введите здесь описание изображения

Я использую следующее, чтобы получить средства определенных столбцов, определенных функцией. Это выведет средние значения записей столбцов 3 и 4, для которых соответствующая запись в столбце 1 равна 2.

Mean@consider[dalist, 1, 2, {3, 4}]

введите здесь описание изображения

Теперь я хотел бы добавить ограничения/пороги для усредняемых значений:

Усреднить значения, если они равны:

  • Выше minValue (например, 3)
  • Ниже maxValue (например, 25)

Ниже приводится пример значений, среднее значение которых должно быть рассчитано при указанных выше ограничениях.

введите здесь описание изображения


person 500    schedule 08.06.2011    source источник
comment
Между прочим, в вашем исходном коде оператор Select сам по себе возвращает именно то, что вы ищете, поскольку MapThread[{#1, #2}&, ...] и Transpose являются точными инверсиями друг друга.   -  person rcollyer    schedule 08.06.2011
comment
@rcollyer, Спасибо, я адаптировал это из следующего, и, удалив № 3, я не подумал об избыточности! MapThread[Disk[{#1, #2}, #3] &, Transpose@ Partition[ Flatten@Union[ Select[t4dataLAEH10, (#[[9]] == disp) &][[All, 54 ;; 77]]], 3]]   -  person 500    schedule 08.06.2011
comment
предположим, вам нужны только первые 4 точки, то есть {conditionCOL, conditionVAL}={1,1}. Какое отфильтрованное среднее значение вы ожидаете от этого? Есть два способа интерпретировать это: оба столбца должны соответствовать критериям фильтрации, что дает среднее значение {4,20}, или каждый столбец фильтруется независимо, что дает среднее значение {4, 37/2}. Текущие ответы дают первый результат, в то время как я подозреваю, что вы хотите последнего.   -  person rcollyer    schedule 10.06.2011


Ответы (2)


Поскольку неясно, хотите ли вы просто исключить из усреднения точки, выходящие за пределы, или решить, выполнять усреднение или нет, я отвечу на оба вопроса. Вы можете использовать следующие функции для постобработки результатов вашей функции consider (они довольно специфичны, в зависимости от вашего формата данных):

filter[data : {{_, _} ..}, {min_, max_}] := 
   Select[data, min < #[[1]] < max && min < #[[2]] < max &]

dataWithinLimitsQ[data : {{_, _} ..}, {min_, max_}] := 
   data == filter[data, {min, max}]

meanFiltered[data : {{_, _} ..}, {min_, max_}] := 
   Mean@filter[data, {min, max}]

Вот как вы можете их использовать:

In[365]:= dalist=Join[Tuples[Range[4],2]\[Transpose],{Range[16],Range[17,32,1]}]\[Transpose]
Out[365]= {{1,1,1,17},{1,2,2,18},{1,3,3,19},{1,4,4,20},{2,1,5,21},{2,2,6,22},{2,3,7,23},
{2,4,8,24},{3,1,9,25},{3,2,10,26},{3,3,11,27},{3,4,12,28},{4,1,13,29},{4,2,14,30},{4,3,15,31},
{4,4,16,32}}

In[378]:= considered = consider[dalist,1,1,{3,4}]

Out[378]= {{1,17},{2,18},{3,19},{4,20}}

In[379]:= filter[considered,{2,21}]

Out[379]= {{3,19},{4,20}}

In[380]:= dataWithinLimitsQ[considered,{2,21}]

Out[380]= False

In[381]:= meanFiltered[considered,{2,21}]

Out[381]= {7/2,39/2}
person Leonid Shifrin    schedule 08.06.2011
comment
@rcollyer Надеюсь, когда-нибудь мы поквитаемся :) Спасибо за голосование. - person Leonid Shifrin; 08.06.2011
comment
Спасибо, Леонид, еще раз. Я оставляю немного без ответа, чтобы посмотреть, вдохновятся ли другие, но это именно то, что мне было нужно. - person 500; 08.06.2011

Я бы использовал Cases:

inRange[data_, {min_, max_}] := Cases[data, {__?(min < # < max &)}, 1]

Эта форма также принимает данные с произвольным количеством столбцов.

dat = {{1, 2, 0}, {6, 7, 4}, {6, 7, 7}, {4, 5, 6}, {4, 5, 3}, {9, 7, 1}, {0, 3, 7}, {6, 2, 1}}

inRange[dat, {2, 7}]

(* Out = {{4, 5, 6}, {4, 5, 3}} *)
person Mr.Wizard    schedule 09.06.2011
comment
К сожалению, первые два столбца данных OP фильтруются по этому шаблону, и он не позволяет напрямую использовать разные диапазоны фильтров для последних двух столбцов. В качестве альтернативного шаблона я бы использовал {_, _, _?(min1 < # < max1&), _?(min2 < # < max2&)}. - person rcollyer; 10.06.2011
comment
@rcollyer я ожидал использовать inRange после consider. Вы предлагаете решение, которое сочетает в себе эти функции? Кроме того, 500 запрашивал разные диапазоны для каждого столбца? - person Mr.Wizard; 10.06.2011
comment
есть некоторая двусмысленность в отношении того, чего он на самом деле хотел, пока он не ответил на мой комментарий выше. Мой nit имел в виду эту двусмысленность и не предполагал объединения двух операций. Кстати, ответ Леонида ведет себя так же. Кроме того, нет, он не просил разные диапазоны для каждого столбца, я просто был самонадеянным/активным. - person rcollyer; 10.06.2011