2016-11-29 159 views
0

在R,做兩個變量表時,你會得到一個頻率表平均值和在表SD

> table(data$Var1, data$Var2) 

    1 2 3 4 5 
    0 0 1 5 6 12 
    1 1 10 6 7 0 
    2 2 6 7 6 3 
    3 2 9 8 3 2 
    4 4 9 5 3 3 
    5 3 4 9 4 4 
    6 2 7 7 4 4 
    7 2 7 7 6 2 
    8 5 7 5 5 2 
    9 5 4 5 6 4 

是有辦法,這樣你包括每行中的meanSD,東西像

 1 2 3 4 5 mean  SD 
    0 0 1 5 6 12 4.20833 0.93153 
    1 1 10 6 7 0 ..  .. 
    2 2 6 7 6 3 
    3 2 9 8 3 2 
    4 4 9 5 3 3 
    5 3 4 9 4 4 
    6 2 7 7 4 4 
    7 2 7 7 6 2 
    8 5 7 5 5 2 
    9 5 4 5 6 4 
+0

@DavidArenburg不會計算數據的SD *和*的意思?它看起來不對...... – Spacedman

+1

@DavidArenburg需要列表的列表,例如:'addmargins(m,2,FUN = list(list(mean,sd)))'我認爲... – Spacedman

+0

@DavidArenburg help(addmargins)is相當曲折的功能性通道迷宮。有時候簡單是最好的(見我的答案!)。 – Spacedman

回答

1

將表保存在一種叫做T,然後:

對於平均值和標準差:

> cbind(T, 
    mean=apply(T,1,function(x){ 
    (sum(x*(1:5)))/sum(x)}), 
    sd=apply(T,1,function(x){sd(rep(1:5,x))})) 

    1 2 3 4 5  mean  sd 
0 4 3 1 1 1 2.200000 1.3984118 
1 1 2 3 3 3 3.416667 1.3113722 
2 2 2 1 2 1 2.750000 1.4880476 
3 0 1 2 4 1 3.625000 0.9161254 

所以2.2和1.3984的平均值和(c(1,1,1,1,2,2,2,3,4,5))

它可能低效計算SD的SD通過重建與原始矢量rep - 但它的晚,併爲sd的所有正方形和平方數的總和不是我的大腦可以在凌晨1點做的事情。

+0

謝謝,但這會增加行的值,併除以5來得到平均值。該表是頻率表,因此您的示例中第一行的平均值爲3.14286,因爲我們有1,1,2,4,4,5,5。 – Algorithmatic

+0

@MustafaS你從哪裏得到1,1,2,4,4,5,5?我得到1.4作爲第一個均值,因爲這是2,1,0,2,2的平均值。 (7/5)。 – Spacedman

+0

@Spacedman - 對於第一排,我認爲有兩個1,一個2,零3,兩個4和兩個5。他們正在擴大表中的數值,然後採取平均值。 – thelatemail