2016-11-29 101 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