R根据多个条件获取行 - 使用dplyr和reshape2

use*_*672 6 conditional filtering r reshape2 dplyr

df <- data.frame(
    exp=c(1,1,2,2),
  name=c("gene1", "gene2", "gene1", "gene2"),
    value=c(1,1,3,-1)
    )
Run Code Online (Sandbox Code Playgroud)

在尝试获得定制时dplyr,reshape2我偶然发现了一种基于几种条件选择行的"简单"方法.如果我想在实验1(== 1)name中具有value高于0的那些基因(变量)并且在实验2中exp同时value低于0; 在df中,这将是"gene2".当然必须有很多方法,例如每组条件的子集df(exp == 1&value> 0,exp == 2和value <0),然后加入这些子集的结果:

library(dplyr)    
inner_join(filter(df,exp == 1 & value > 0),filter(df,exp == 2 & value < 0), by= c("name"="name"))[[1]]
Run Code Online (Sandbox Code Playgroud)

虽然这个作品看起来非常akward的,我觉得这样的条件筛选在于在的心脏reshape2dplyr,但无法弄清楚如何做到这一点.有人可以在这里启发我吗?

A5C*_*2T1 16

想到的另一种选择是将数据转换为"宽"格式,然后进行过滤.

这是使用"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
Run Code Online (Sandbox Code Playgroud)

同样,使用"dplyr"和"tidyr":

library(dplyr)
library(tidyr)
df %>% 
  spread(exp, value) %>% 
  filter(`1` > 0 & `2` < 0)
Run Code Online (Sandbox Code Playgroud)

  • @ user3375672,是的.`dcast`不会尝试创建语法上有效的名称,因此在这种情况下,我们最终得到名为"1"和"2"的列.由于它们在语法上不合法,因此需要以某种方式引用它们. (2认同)