计算差异并在单独的列中总结

时间:2012-12-15 19:02:32

标签: r

我有许多变量有很多观察结果。我有一个标准变量。现在,我只想在观察值大于标准值并将所有差异总结为单独的变量时计算标准变量和观测变量之间的差异。此外,在单独的列中大于标准的变量的名称。

Names   Standard    Das Dss Tri Tet
Aa  32  42  21  45  34
Ab  23  25  43  43  32
Ac  43  34  23  32  23
Ad  23  24  33  12  23
Ae  14  24  12  20  24
Af  43  42  13  12  43
Ag  12  13  22  13  22
Ah  32  32  42  42  23

输出:

Names   Standard    Das Dss Tri Tet Difference  No_Difference   Names_Difference
Aa  32  42  21  45  34  15  3   Das, Tri, Tet
Ab  23  25  43  43  32  52  4   Das,Dss,Tri,Tet
Ac  43  34  23  32  23  0   0   NA
Ad  23  24  33  12  23  10  2   Das,Dss
Ae  14  24  12  20  24  26  4   Das,Tri,Tet
Af  43  42  13  12  43  0   0   NA
Ag  12  13  22  13  22  22  4   Das,Dss,Tri,Tet
Ah  32  32  42  42  23  20  2   Dss,Tri

2 个答案:

答案 0 :(得分:3)

假设您上面的数据存储在对象df中。然后这应该工作

df2 <- do.call(rbind, apply(df[, -1], 1, function(z) {
        ind <- z[2:5] > z[1]
        return(cbind.data.frame(
                        Difference = sum(z[2:5][ind] - z[1]), 
                        No_Difference = sum(ind), 
                        Names_Difference = paste(colnames(df[3:6])[ind], 
                                collapse = ", ")
                ))
    }))

df <- cbind(df, df2)
df

  Names Standard Das Dss Tri Tet Difference No_Difference   Names_Difference
1    Aa       32  42  21  45  34         25             3      Das, Tri, Tet
2    Ab       23  25  43  43  32         51             4 Das, Dss, Tri, Tet
3    Ac       43  34  23  32  23          0             0                   
4    Ad       23  24  33  12  23         11             2           Das, Dss
5    Ae       14  24  12  20  24         26             3      Das, Tri, Tet
6    Af       43  42  13  12  43          0             0                   
7    Ag       12  13  22  13  22         22             4 Das, Dss, Tri, Tet
8    Ah       32  32  42  42  23         20             2           Dss, Tri

尽管你的变量排序在某些时候发生了变化,但这并不是很优雅,使用整数来索引列并不是很健壮

答案 1 :(得分:2)

要仅添加标准val小于obs的值,这是一种简单的方法。我的例子是单行,所以我将使用向量。

> foo<- sample(10,10,replace=TRUE)
> foo
 [1]  7  5 10  8  8  7  4  1  8  2
> sum((foo[-1]-foo[1])*(foo[-1]>foo[1]))
 [1] 6

其他人可以进行名字收集: - )