2

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

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
4

2 回答 2

3

假设您上面的数据存储在 object 中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

尽管这不是很优雅,并且使用整数来索引列也不是很健壮,以防变量的顺序在某些时候发生变化

于 2012-12-15T20:00:39.190 回答
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

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

于 2012-12-15T22:20:10.743 回答