首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据一列中的多个值创建行子集

根据一列中的多个值创建行子集
EN

Stack Overflow用户
提问于 2014-07-29 19:48:24
回答 4查看 672关注 0票数 1

我有一个这样的数据文件,其中前两列是人和鼠的对应基因名(基本上是同名,大写不同)。

代码语言:javascript
复制
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。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-29 20:02:07

试试这个:

代码语言:javascript
复制
# 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

另一种选择是:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2014-07-29 20:10:44

以下是另一个策略:

代码语言:javascript
复制
> 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
票数 3
EN

Stack Overflow用户

发布于 2014-07-29 20:15:18

如果您的器官列只包含肺和心这两个值,下面是另一种方法:

代码语言:javascript
复制
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  Lung
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25023721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档