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

时间:2018-03-28 13:35:17

标签: r group-by dplyr

现在我正在使用' dplyr'重构基于'的R脚本代替。

基本上,我想group_by Gene并按照与给定条件匹配的组分组减去值。在这种情况下,我想要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

期望的输出:

  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

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

&#39;伪&#39;代码:

df %>%
    group_by(Gene) %>%
    mutate(deltaC = Value - Value(where Gene == 'C'))

是否有任何类型的功能允许我只访问Gene ==&#39; C&#39 ;?当然我之前也可以做一个子集,但我想一步完成:)

2 个答案:

答案 0 :(得分:3)

如果您想完全避免使用$,则可以像这样使用dplyr::pull

df %>%
  group_by(gene) %>%
  mutate(deltaC = value - filter(., gene == 'C') %>% pull(value))

dplyr::pull基本上只是管道友好的,dplyr等效于df$valuedf$[["value"]]

此外,使用filter语句内的.表示要通过管道传递给mutate语句的数据。

答案 1 :(得分:2)

你基本上拥有它!您可以使用过滤器根据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))

这两个都给出了相同的结果:

# Subset with base bracket notation:
df %>%
    group_by(gene) %>%
    mutate(deltaC = value -  x[x$gene == 'C', 'value'])

# Subset with dplyr::filter()
df %>%
    group_by(gene) %>%
    mutate(deltaC = value - filter(df, gene == 'C')$value)

  gene  sample value deltaC
  <fct> <fct>  <dbl>  <dbl>
1 A     wt      32.3  11.8 
2 A     mut1    31.0   9.80
3 A     mut2    30.5  10.7 
4 B     wt      25.0   4.50
5 B     mut1    25.3   4.10
6 B     mut2    22.1   2.30
7 C     wt      20.5   0.  
8 C     mut1    21.2   0.  
9 C     mut2    19.8   0.