使用R在组内减法

时间:2014-06-04 17:21:31

标签: r

我一直在努力寻找在群体中进行减法的最佳方法。我的数据框包含一长串样本(Sample),每个样本都用不同的条件(condition)处理,产生一个测量值(value)。我想从条件A中减去每个条件,得到dValue

    Sample   condition      value    dValue
    var1         A            12       0
    var1         B            14      -2
    var1         C            15      -3
    var2         A            20       0
    var2         B            19       1
    var2         C            19       1
    var3         A            50       0
    var3         B            51      -1
    var3         C            48       2

使用R实现此目标的最佳方法是什么?我可以在excel中轻松完成这项任务,并且已经将数据转换到这一点,切换到Excel,然后返回到R,我知道有更好的方法。

3 个答案:

答案 0 :(得分:2)

您也可以使用dplyr执行此操作:

require(dplyr)

df %.% 
   group_by(Sample) %.% 
   mutate(dValue = value[condition == "A"] - value)

#  Sample condition value dValue
#1   var1         A    12      0
#2   var1         B    14     -2
#3   var1         C    15     -3
#4   var2         A    20      0
#5   var2         B    19      1
#6   var2         C    19      1
#7   var3         A    50      0
#8   var3         B    51     -1
#9   var3         C    48      2

答案 1 :(得分:1)

试试这个

> transform(df, dValue=ave(value, Sample, FUN=function(x) c(0, x[1]-x[-1])))
  Sample condition value dValue
1   var1         A    12      0
2   var1         B    14     -2
3   var1         C    15     -3
4   var2         A    20      0
5   var2         B    19      1
6   var2         C    19      1
7   var3         A    50      0
8   var3         B    51     -1
9   var3         C    48      2

我假设df看起来像这样

  Sample condition value
1   var1         A    12
2   var1         B    14
3   var1         C    15
4   var2         A    20
5   var2         B    19
6   var2         C    19
7   var3         A    50
8   var3         B    51
9   var3         C    48

答案 2 :(得分:0)

假设您的数据集名为dat,这里有几个data.table解决方案:

方法1:

require(data.table) ## >= 1.9.2
setDT(dat)[, dValue := value[condition == "A"] - value, by=Sample]

方法2:

require(data.table) ## >= 1.9.2
setkey(setDT(dat), Sample)
dat[dat[condition == "A"], dValue := i.value-value]

#    Sample condition value dValue
# 1:   var1         A    12      0
# 2:   var1         B    14     -2
# 3:   var1         C    15     -3
# 4:   var2         A    20      0
# 5:   var2         B    19      1
# 6:   var2         C    19      1
# 7:   var3         A    50      0
# 8:   var3         B    51     -1
# 9:   var3         C    48      2