Как выбрать стандартное отклонение в ряду?(в SQL - или R :) - PullRequest
4 голосов
/ 21 октября 2010

Интересно, есть ли способ выбрать стандартное отклонение из нескольких целочисленных полей в MySQL в одной строке. Очевидно, что если я использую

SELECT STDDEV(col1) FROM mytable

Я просто получаю стандартное отклонение этого конкретного столбца. Давайте предположим, что у меня есть таблица как: id,somefield1,somefield2, integerfield1,integerfield2,integerfield3, ... ,integerfield30. Теперь я хотел бы выбрать стандартное отклонение целого поля 1-30 в строке и сохранить его как sdfield. Конечно, я мог бы использовать статистическое программное обеспечение для этого, но мне просто интересно, есть ли способ сделать это непосредственно в MySQL.

Ответы [ 4 ]

3 голосов
/ 22 октября 2010

С R:

df <- your.pull
sd(t(df[sapply(df, is.numeric)]))

Извлечение данных с помощью RMySQL или RODBC, удаление нецифровых столбцов, транспонирование и использование SD.

2 голосов
/ 21 октября 2010

Вы пытались использовать UNION для эффективного размещения всех значений столбцов в отдельных строках?Примерно так, может быть:

SELECT STDDEV(allcols)
FROM (
    SELECT col1 FROM table WHERE id=requiredID
    UNION
    SELECT col2 FROM table WHERE id=requiredID
    UNION
    SELECT col3 FROM table WHERE id=requiredID
    UNION
    SELECT col4 FROM table WHERE id=requiredID
    UNION
    SELECT col5 FROM table WHERE id=requiredID
)
2 голосов
/ 21 октября 2010

для простоты предположим, что у вас есть n столбцы с именами A, B, C ....:

SELECT SQRT(  
  (A*A + B*B + C*C + ...)/n  - (A+B+C+...)*(A+B+C+...)/n/n) AS sd
  FROM table;
1 голос
/ 22 октября 2010

Я нашел два решения самостоятельно:

1) Нормализовать базу данных.Я получаю две таблицы:

Таблица один UID |информация1 |metainformation2

Таблица 2 UID |col |result_of_col

Тогда я могу легко использовать стандартную функцию STDDEV.

2) Используйте R. Данные являются ненормализованным форматом, потому что они должны использоваться в статистическом анализе.Таким образом, легко войти в R и использовать следующий код.

sd (t (набор данных [1: 4,3: 8]))

Обратите внимание, что я просто беру числовую часть этого data.frame, оставляя выбор столбцов 3-8,И не получайте слишком много данных (поэтому на этот раз я использую только первые несколько строк).t () транспонирует данные, которые необходимы, потому что sd () работает только со столбцами.

В пакете vsn есть функция rowSds, которая должна работать аналогично rowMean и rowSum, но почему-то это не рекомендуется.По крайней мере, эти пакеты не были доступны на зеркале швейцарского CRAN;).

HTH кто-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...