我一直在努力寻找在群体中进行减法的最佳方法。我的数据框包含一长串样本(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,我知道有更好的方法。
答案 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
解决方案:
require(data.table) ## >= 1.9.2
setDT(dat)[, dValue := value[condition == "A"] - value, by=Sample]
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