从其他行中减去特定行中的输入

时间:2018-02-09 15:05:38

标签: r mutate

我有这种数据

dist = math.hypot(x2 - x1, y2 - y1)

我想减去"背景"的强度值。从样本A,B,C和D的强度值,并将值放在一个新列(可能使用mutate函数)。

另外,当我有两个不同的数据类型时,如:

  Sample Name  Type    Intensity    
1.   A           1        16        
2.   B           1        12
3.   C           1        13
4.   D           1        10
5.   Background  1        2   

我想做同样的事情,但是从类型1的样本和样本类型2的类型2的背景中减去类型1的背景。

所以我会得到这样的东西:

   Sample Name  Type    Intensity    
1.   A           1        16        
2.   B           1        12
3.   C           1        13
4.   D           1        10
5.   Background  1        2   
6.   A           2        14
7.   B           2        12
8.   C           2        9
9.   D           2        7
10.  Background  2        3

2 个答案:

答案 0 :(得分:4)

根据OP的示例,数据集似乎是data.table。因此,我们使用data.table方法。在按“类型”分组后,获取“强度”与“强度”的差异,我们将“Sample_Name”设置为“背景”并指定(:=)它以创建“强度已修正”列

setDT(df2) #in case it is not data.table 
df2[, IntensityCorrected := Intensity - Intensity[Sample_Name == "Background"], by = Type]
df2
#    Sample_Name Type Intensity IntensityCorrected
# 1:           A    1        16                 14
# 2:           B    1        12                 10
# 3:           C    1        13                 11
# 4:           D    1        10                  8
# 5:  Background    1         2                  0
# 6:           A    2        14                 11
# 7:           B    2        12                  9
# 8:           C    2         9                  6
# 9:           D    2         7                  4
#10:  Background    2         3                  0

使用base R,选项为ave

with(df2, Intensity - ave(Intensity*(Sample_Name == "Background"),
                 Type, FUN = function(x) x[x !=0])) 

答案 1 :(得分:2)

df  =read.table(text="   Sample Name  Type    Intensity    
1.   A           1        16        
                2.   B           1        12
                3.   C           1        13
                4.   D           1        10
                5.   Background  1        2   
                6.   A           2        14
                7.   B           2        12
                8.   C           2        9
                9.   D           2        7
                10.  Background  2        3", header=T)

替代dplyr

df %>% group_by(Type) %>% 
mutate(Intensity.corrected = Intensity-Intensity[Name=="Background"][1])

输出:

  Sample       Name Type Intensity Intensity.corrected
1       1          A    1        16                  14
2       2          B    1        12                  10
3       3          C    1        13                  11
4       4          D    1        10                   8
5       5 Background    1         2                   0
6       6          A    2        14                  11
7       7          B    2        12                   9
8       8          C    2         9                   6
9       9          D    2         7                   4
10     10 Background    2         3                   0

希望这有帮助!