在Mathematica中的条件查询/操作中添加约束

时间:2011-06-08 14:39:21

标签: wolfram-mathematica conditional average threshold

我使用以下函数对List执行条件操作:

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];

enter image description here

我使用以下内容来获取函数定义的特定列的方法。 这将输出第3栏和第3栏的条目。 4,第1列中的相应条目等于2

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

enter image description here

现在,我想在要平均的值上添加约束/阈值:

平均值:

  • 高于minValue(例如,3)
  • 在maxValue下(例如,25)

下面,给出一个例子,其值的平均值应在上述约束条件下计算。

enter image description here

2 个答案:

答案 0 :(得分:5)

由于不清楚是否只想从平均值中排除极限以外的点,或者决定是否进行平均,我将解决这两个问题。您可以使用以下函数对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}

答案 1 :(得分:2)

我会使用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}} *)