Условный подсчет в Mathematica - PullRequest
1 голос
/ 24 июня 2011

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

dalist = {{1, a, 1}, {2, s, 0}, {1, d, 0}, {2, f, 0}, {1, g, 1}}

enter image description here

Я хотел бы посчитать, сколько раз определенное значение в первом столбце принимает определенное значение в столбце 3.

Так что в этом примере мой желаемый результат будет:

{{1,1,2}, {1,0,1}, {2,1,0}, {2,0,2}}

или:

enter image description here

Где последний подсписок {2,0,2} читается как: Когда значение равно 2 в первом столбце, соответствующее значение (та же строка в мире матриц) в столбце 3 из 0 присутствует дважды.

Надеюсь, это не смущает. Я добавил второй столбец, чтобы передать тот факт, что столбцы удалены друг от друга.

Если возможно, переупорядочивание быть не должно.

РЕДАКТИРОВАТЬ:

{1,2,3,4,5}

{1,0}

- это точные значения, взятые столбцами, с которыми я на самом деле имею дело в моих данных.

Я знаю, что мне не хватает правильного описания. Пожалуйста, измените, если вы можете и знаете это. Спасибо

Ответы [ 4 ]

4 голосов
/ 25 июня 2011

Из того, что я понял, это должно быть сделано:

In[11]:= dalist = {{1, a, 1}, {2, s, 0}, {1, d, 0}, {2, f, 0}, {1, g, 1}}

Out[11]= {{1, a, 1}, {2, s, 0}, {1, d, 0}, {2, f, 0}, {1, g, 1}}

In[12]:= Map[Flatten, Tally[dalist[[All, {1, 3}]]]]

Out[12]= {{1, 1, 2}, {2, 0, 2}, {1, 0, 1}}

В вашем примере у вас фактически нет комбинации {2,1}, но у вас есть комбинация {2,0}дважды, а не один раз - таким образом, результат отличается от того, что вы ожидали.То есть, если я правильно понял вопрос.

3 голосов
/ 25 июня 2011

Я пытался придумать что-то совершенно новое, используя предположения Саши о необходимом выводе, но это стало больше похоже на его код, чем я думал. Тем не менее различия достаточно интересны для публикации.

   {#1, #2, Count[dalist[[All, {1, 3}]], {##}]} & @@@ 
    Tuples[
       {DeleteDuplicates@dalist[[All, 1]], 
        DeleteDuplicates@dalist[[All, 3]]}
    ]

Редактировать
С вашим разъяснением о вводе код может быть упрощен и фактически улучшен до:

   {#1, #2, Count[dalist[[All, {1, 3}]], {##}]}& @@@Tuples[{Range[5],{0,1}}]

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

3 голосов
/ 24 июня 2011

Вы можете использовать комбинацию Outer и Count:

In[39]:= Flatten[Outer[
  {#1, #2, Count[dalist, {#1, _, #2}]} &,
  DeleteDuplicates@dalist[[All, 1]], 
  DeleteDuplicates@dalist[[All, -1]] ], 1]

Out[39]= {{1, 1, 2}, {1, 0, 1}, {2, 1, 0}, {2, 0, 2}}
1 голос
/ 24 августа 2011

Вот вариант второго метода Шёрда, который может быть или не быть легче для чтения и адаптации.

Join @@ Table[{i, j, dalist[[All, {1,3}]] ~Count~ {i, j}}, {i,5}, {j,0,1}]

Можно использовать Array таким же образом:

Join @@ Array[{##, dalist[[All, {1,3}]] ~Count~ {##}} &, {5,2}, {1,0}]

Если у вас большой стол, извлечение будет целесообразно выполнить только один раз:

With[{x = dalist[[All, {1,3}]]},
 Join @@ Array[{##, x~Count~{##}} &, {5,2}, {1,0}]
]
...