dplyr:按匹配给定条件的组逐组减去值

int*_*ang 3 group-by r dplyr

现在我正在使用“dplyr”来重构基于“base”的 R 脚本。

基本上,我想对 Gene 进行 group_by 并按组减去与给定条件匹配的组的值。在这种情况下,我想要 Gene == 'C' 的值,并从所有其他值中减去它们。

简化数据:

x <- data.frame('gene' = c('A','A','A','B','B','B','C','C','C'),
                'sample' = rep_len(c('wt','mut1','mut2'),3),
                'value' = c(32.3,31,30.5,25,25.3,22.1,20.5,21.2,19.8))

  gene sample value
1    A     wt  32.3
2    A   mut1  31.0
3    A   mut2  30.5
4    B     wt  25.0
5    B   mut1  25.3
6    B   mut2  22.1
7    C     wt  20.5
8    C   mut1  21.2
9    C   mut2  19.8
Run Code Online (Sandbox Code Playgroud)

期望的输出:

  gene sample value deltaC
1    A     wt  32.3   11.8
2    A   mut1  31.0    9.8
3    A   mut2  30.5   10.7
4    B     wt  25.0    4.5
5    B   mut1  25.3    4.1
6    B   mut2  22.1    2.3
7    C     wt  20.5    0.0
8    C   mut1  21.2    0.0
9    C   mut2  19.8    0.0
Run Code Online (Sandbox Code Playgroud)

我认为这没什么大不了的,但我想知道是否有一个使用 dplyr 的简单解决方案。

'伪代码:

df %>%
    group_by(Gene) %>%
    mutate(deltaC = Value - Value(where Gene == 'C'))
Run Code Online (Sandbox Code Playgroud)

是否有任何类型的函数允许我仅访问 Gene == 'C' 的值?当然我之前也可以做一个子集,但我想一步完成:)

div*_*san 8

你基本上已经有了!您可以根据 mutate 调用中的任何条件对数据框进行子集化:

df <- data.frame('gene' = c('A','A','A','B','B','B','C','C','C'),
                 'sample' = rep_len(c('wt','mut1','mut2'),3),
                 'value' = c(32.3,31,30.5,25,25.3,22.1,20.5,21.2,19.8))
Run Code Online (Sandbox Code Playgroud)

尼古拉斯·哈桑指出了这个答案的原始版本的问题。虽然您可以按“基因”分组,然后使用原始 data.frame 的过滤版本进行变异,但您最可能想要做的是按“样本”分组,然后在“基因”的样本组中进行子集:

df %>%
    group_by(sample) %>%
    mutate(deltaC = value - value[gene == 'C'])

# A tibble: 9 x 4
# Groups:   sample [3]
  gene  sample value deltaC
  <fct> <fct>  <dbl>  <dbl>
1 A     wt      32.3   11.8
2 A     mut1    31      9.8
3 A     mut2    30.5   10.7
4 B     wt      25      4.5
5 B     mut1    25.3    4.1
6 B     mut2    22.1    2.3
7 C     wt      20.5    0  
8 C     mut1    21.2    0  
9 C     mut2    19.8    0  
Run Code Online (Sandbox Code Playgroud)

在分组的 data.frame 中,mutate 将每个组作为其自己的迷你数据框起作用,因此您可以将向value量子集到仅所在行gene == 'C',然后从该组中的整个变量中减去value该行以得到deltaC