df <- data.frame(
exp=c(1,1,2,2),
name=c("gene1", "gene2", "gene1", "gene2"),
value=c(1,1,3,-1)
)
在尝试定制时dplyr
,reshape2
我偶然发现了一种“简单”的方法来根据几种条件选择行。如果我想让那些在实验1(== 1)中大于0并同时在实验2中小于0的基因(name
变量);在df中,这将是“ gene2”。当然,必须有很多方法,例如,每组条件的子集df(exp == 1且值> 0,exp == 2且值<0),然后将这些子集的结果合并:value
exp
value
library(dplyr)
inner_join(filter(df,exp == 1 & value > 0),filter(df,exp == 2 & value < 0), by= c("name"="name"))[[1]]
虽然这个作品看起来非常akward的,我觉得这样的空调过滤在谎言的心脏reshape2
和dplyr
,但无法弄清楚如何做到这一点。有人可以在这里启发我吗?
想到的一种替代方法是将数据转换为“宽”格式,然后进行过滤。
这是一个使用“ data.table”的示例(为便于复合语句使用):
library(data.table)
dcast.data.table(as.data.table(df), name ~ exp)[`1` > 0 & `2` < 0]
# name 1 2
# 1: gene2 1 -1
同样,对于“ dplyr”和“ tidyr”:
library(dplyr)
library(tidyr)
df %>%
spread(exp, value) %>%
filter(`1` > 0 & `2` < 0)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句