现在我正在使用' 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 ;?当然我之前也可以做一个子集,但我想一步完成:)
答案 0 :(得分:3)
如果您想完全避免使用$
,则可以像这样使用dplyr::pull
:
df %>%
group_by(gene) %>%
mutate(deltaC = value - filter(., gene == 'C') %>% pull(value))
dplyr::pull
基本上只是管道友好的,dplyr等效于df$value
或df$[["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.