2010-10-21 74 views
4

我不知道是否有辦法在同一行中的MySQL中的幾個整數字段中選擇標準偏差。很明顯,如果我使用如何選擇行內的標準偏差? (在SQL中 - 或R :)

SELECT STDDEV(col1) FROM mytable 

我只是得到該特定列的標準偏差。假設我有一張表,如: id,somefield1,somefield2, integerfield1,integerfield2,integerfield3, ... ,integerfield30。 現在我想選擇一行中整數字段1-30的標準偏差並將其保存爲AS sdfield。當然,我可以使用統計軟件,但我只是想知道是否有辦法直接在MySQL中執行此操作。

回答

1

我發現我自己的兩個解決方案:

1)規範化數據庫。我結束了兩個表:

表一 uid | information1 | metainformation2

表二 uid | col | result_of_col

然後我可以很容易地使用標準的STDDEV功能。

2)使用R.數據是非歸一化格式,因爲它應該用於統計分析。因此,進入R並使用下面的代碼很容易。

SD(T(數據集[1:4,3:8]))

注意,我只留下選擇的列3-8藉此data.frame的數字部分。並且不會被太多的數據所擊​​中(這就是爲什麼我這次只使用前幾行)。 t()轉換所需的數據,因爲sd()僅適用於列。

在vsn包中有一個函數rowSds,它應該類似於rowMean和rowSum,但不知何故,這可能會被棄用。至少這個軟件包在瑞士CRAN鏡像上不可用;)。

HTH別人。

+0

正常化數據庫會好得多。 – 2010-10-22 13:34:23

2

爲簡單起見,假設你有n列,命名爲ABC ....:

SELECT SQRT( 
    (A*A + B*B + C*C + ...)/n - (A+B+C+...)*(A+B+C+...)/n/n) AS sd 
    FROM table; 
+0

或者做一個函數。 – 2010-10-21 08:05:09

+0

基本上我喜歡用一個公式來做這件事的想法......但我不太確定這種轉變是否正確。你不應該SQRT()從平均值加起來的差異?用你的公式我得到不同的結果。 – 2010-10-22 06:57:29

+0

是的,它應該使用SQRT(),請參閱http://en.wikipedia.org/wiki/Standard_deviation在「標識和數學屬性」部分 – 2010-10-22 13:34:00

2

您是否嘗試過使用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 
) 
3

隨着R:

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

與RMySQL或RODBC提取數據,除去非數值列,轉置和使用SD。

+0

+1爲快捷鍵。雖然這在我的情況下不起作用,因爲我有一些與sd無關的數字(例如id或其他變量)。因此無論如何我需要手動執行此操作。我只是想知道是否有更好的方法比在R中做這個更好。現在,我使用dbWriteTable寫回到數據庫,並想知道我是否可以向表中添加列,或者是否最好將它們完全刪除並寫入R. – 2010-10-22 15:27:48

+0

什麼是列名?如果可以使用一致的模式匹配colname,則可以使用df [grep()]進行拉取。爲了回寫表格,我不會使用dbWriteTable,因爲它可以覆蓋或追加那些本不應該存在的數據,我會使用dbGetQuery()並使用UPDATE調用。 – 2010-10-22 19:36:38