Избегайте и подсчитывайте нечисловые значения, вычисляя базовую статистику в Mathematica - PullRequest
3 голосов
/ 18 августа 2011

Пожалуйста, примите во внимание:

dalist={{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 
       {2.88`, 2.04`, 4.64`,0.56`, 4.92`, 2.06`, 3.46`, 2.68`, 2.72`,0.820},   
       {"Laura1", "Laura1", "Laura1", "Laura1", "Laura1", 
       "Laura1", "Laura1", "Laura1", "Laura1","Laura1"}, 
       {"RIGHT", 0, 1, 15.1`, 0.36`, 505, 20.059375`,15.178125`, ".", "."}}

enter image description here

Фактический набор данных составляет около 6 000 строк и 147 столбцов. Однако вышесказанное отражает его содержание. Я хотел бы вычислить некоторые основные статистические данные, такие как среднее значение. Моя попытка:

Table[Mean@dalist[[colNO]], {colNO, 1, 4}]

enter image description here

Как я могу создать такую ​​функцию, как:

  • Избегайте нечисловых значений и

  • Подсчитать количество нечисловых значений, найденных в каждом списке.

Мне пока не удалось найти правильный шаблонный механизм.

Ответы [ 3 ]

6 голосов
/ 18 августа 2011

Первое наблюдение: вы можете использовать Mean /@ dalist, если хотите усреднить по строкам. Вам не нужна Table функция здесь.

Попробуйте использовать Cases ( документация ), например. Mean /@ (Cases[#,_?NumericQ] & /@ dalist)

Если вы хотите быть хитрым и исключить строки из ваших данных, которые не имеют числовых элементов (например, ваш третий столбец), попробуйте следующее. Сначала он выбирает только те строки, которые имеют некоторые числовые элементы, а затем берет только числовые элементы из этих строк.

Mean /@ (Cases[#,_?NumericQ] & /@ (Cases[dalist, {___,_?NumericQ,___}]))

Для подсчета нечисловых элементов вы должны использовать аналогичный подход:

Length /@ (Cases[#,Except[_?NumericQ]] & /@ dalist)

В этом ответе есть оговорка, которую я напечатал без установки Mathematica, чтобы фактически проверить мой синтаксис. Некоторые опечатки могли вспомнить.

3 голосов
/ 18 августа 2011

Вот вариант ответа Вербеи, который вы можете рассмотреть.

Предполагая, что это прямоугольный массив (все строки имеют одинаковую длину), затем установите d в длину строки (которую можно найти с помощью Dimensions):

d = 10;

{d - Length@#, Mean@#} &@Select[#, NumericQ] & /@ dalist
(* Out: *) {{0, 11/2}, {0, 2.678}, {10, Mean[{}]}, {3, 79.5282}}

То есть пары {number_of_non-numeric, medium}.

Mean[{}] появляется там, где нет числовых значений для усреднения. Его можно удалить из списка с помощью DeleteCases, но результаты больше не будут совпадать со строками dalist. Я думаю, что было бы лучше использовать что-то вроде: /. Mean[{}] -> "NO AVERAGE" при необходимости.

2 голосов
/ 18 августа 2011

Ключом к ответу на ваш вопрос является функция NumberQ : «* NumberQ [expr] дает True, если expr является числом, и False в противном случае.»

Для вычисления среднеготолько числовые элементы в каждом списке:

Map[Function[lst, Mean[Select[lst, NumberQ]]], dalist]

Для подсчета количества нечисловых элементов в каждом списке:

Map[Function[lst, Length[Select[lst, Function[x, !NumberQ[x]]]]], dalist]
...