我有一个这样的数据文件,其中前两列是人和鼠的对应基因名(基本上是同名,大写不同)。
Human Rat RNAtype Exp Organ
BBS1 Bbs1 reg 7 Lung
ASAP2 Asap2 reg 5 Heart
ASAP2 Asap2 CANONICAL 5 Heart
ASAP2 Asap2 reg 6 Heart
ASAP2 Asap2 reg 8 Lung
ASAP3 Asap3 SCRAMBLED 5 Heart
ASAP3 Asap3 scram 8 Heart
ASAP3 Asap3 CANONICAL 5 Heart
ASAP3 Asap3 reg 5 Heart现在我想用下面的方式来做它的子集。如果一个基因同时存在于肺和心脏中,那么我将把它包含在我的子集中。例如,在第一行的基因中,BBS1只存在于肺中,而不在心脏中,因此它不会出现在子集中。但ASAP2同时存在于心脏和肺。所以,它会在子集中。ASAP3不会出现在子集中,因为它不存在于肺中。
现在实际的数据文件非常大。在第一/第二列中,基因名称的顺序与这里的方式不同,可以是ASAP2、ASAP3、ASAP3、BBS1、ASAP2、ASAP2。
发布于 2014-07-29 20:02:07
试试这个:
# read in sample data
df<-read.table(text="
Human Rat RNAtype Exp Organ
BBS1 Bbs1 reg 7 Lung
ASAP2 Asap2 reg 5 Heart
ASAP2 Asap2 CANONICAL 5 Heart
ASAP2 Asap2 reg 6 Heart
ASAP2 Asap2 reg 8 Lung
ASAP3 Asap3 SCRAMBLED 5 Heart
ASAP3 Asap3 scram 8 Heart
ASAP3 Asap3 CANONICAL 5 Heart
ASAP3 Asap3 reg 5 Heart", header=TRUE)
merge(df[df$Organ=="Heart",], df[df$Organ=="Lung",], by=c("Human","Rat"))
Human Rat RNAtype.x Exp.x Organ.x RNAtype.y Exp.y Organ.y
1 ASAP2 Asap2 reg 5 Heart reg 8 Lung
2 ASAP2 Asap2 CANONICAL 5 Heart reg 8 Lung
3 ASAP2 Asap2 reg 6 Heart reg 8 Lung另一种选择是:
genes2keep <- intersect(df[df$Organ=="Heart",]$Human, df[df$Organ=="Lung",]$Human)
df[df$Human %in% genes2keep, ]
Human Rat RNAtype Exp Organ
2 ASAP2 Asap2 reg 5 Heart
3 ASAP2 Asap2 CANONICAL 5 Heart
4 ASAP2 Asap2 reg 6 Heart
5 ASAP2 Asap2 reg 8 Lung发布于 2014-07-29 20:10:44
以下是另一个策略:
> u <- with(df, by(Human, Organ, unique))
> df[df$Human %in% intersect(u[[1]], u[[2]]), ]
Human Rat RNAtype Exp Organ
2 ASAP2 Asap2 reg 5 Heart
3 ASAP2 Asap2 CANONICAL 5 Heart
4 ASAP2 Asap2 reg 6 Heart
5 ASAP2 Asap2 reg 8 Lung发布于 2014-07-29 20:15:18
如果您的器官列只包含肺和心这两个值,下面是另一种方法:
library(dplyr)
dfsub <- df %>%
group_by(Human) %>%
filter(length(unique(Organ)) >= 2)
#Source: local data frame [4 x 5]
#Groups: Human
#
# Human Rat RNAtype Exp Organ
#1 ASAP2 Asap2 reg 5 Heart
#2 ASAP2 Asap2 CANONICAL 5 Heart
#3 ASAP2 Asap2 reg 6 Heart
#4 ASAP2 Asap2 reg 8 Lunghttps://stackoverflow.com/questions/25023721
复制相似问题