如何基于与R的部分字符串匹配合并两个数据帧?

问题描述 投票:-1回答:2

我有两个数据框:

第一个包含大量蛋白质,我已经进行了多次计算。这里有一个例子:

>Accession  Description # Peptides A2   # PSM A2    # Peptides B2   # PSM B2    # Peptides C2   # PSM C2    # Peptides D2   # PSM D2    # Peptides E2   # PSM E2    # AAs   MW [kDa]    calc. pI
P01837  Ig kappa chain C region OS=Mus musculus PE=1 SV=1 - [IGKC_MOUSE]    10  319 8   128 8   116 7   114         106 11,8    5,41
P01868  Ig gamma-1 chain C region secreted form OS=Mus musculus GN=Ighg1 PE=1 SV=1 - [IGHG1_MOUSE]  13  251 15  122 16  116 16  108         324 35,7    7,40
P60710  Actin, cytoplasmic 1 OS=Mus musculus GN=Actb PE=1 SV=1 - [ACTB_MOUSE]   15  215 10  37  11  30  11  31  16  154 375 41,7    5,48

第二种含有目的蛋白质。这里有一个例子:

>complex    Description Accession   protein
TFIID   [TAF1_MOUSE]    Q80UV9-3    Isoform 3 of Transcription initiation factor TFIID subunit 1 OS=Mus musculus GN=Taf1 - [TAF1_MOUSE]
TFIID   [TAF2_MOUSE]    Q8C176  Transcription initiation factor TFIID subunit 2 OS=Mus musculus GN=Taf2 PE=2 SV=2 - [TAF2_MOUSE]
TFIID   [TAF3_MOUSE]    Q5HZG4  Transcription initiation factor TFIID subunit 3 OS=Mus musculus GN=Taf3 PE=1 SV=2 - [TAF3_MOUSE]

我想做的事情:获取一个数据框,其中包含我的计算中仅用于感兴趣的蛋白质的值。我用过的第一次尝试:

fusion <- merge.data.frame(x=tableaucleanIPTAFXwoNA, y=sublist, by.x="Description", by.y="protein", all =FALSE)

然而,蛋白质名称的命名在两个数据帧之间是不同的,并且使用合并功能这不起作用。

那么,当它是“转录起始因子TFIID亚基10 OS = Mus musculus GN = Taf10 PE = 1 SV = 1 - [TAF10_MOUSE]”字符串文本的一部分时,我怎么能对“TAF10”进行部分匹配?换句话说,我希望R只识别整个字符串中的一个部分。

我试着用grep函数:

idx2 <- sapply("tableaucleanIPTAFX$Description", grep, "sublist$Description")  

但是,我明白了:

as.data.frame(idx2)
[1] tableaucleanIPTAFX.Description
<0 rows> (or 0-length row.names)

我想,模式没有被正确识别...然后我访问了RegExr网站写了一个正则表达式,以便我的id名称可以被识别。我发现这可以识别[TRRAP_MOUSE]

转化/转录结构域相关蛋白OS = Mus musculus GN = Trrap PE = 1 SV = 2 - [TRRAP_MOUSE]:

 /(TRRAP_[MOUSE])\w+/g

我想知道如何将它实现到我的id列表(我的例子中的“Description”列)?

r merge match partial
2个回答
3
投票

这可能对你有用,它处理重复:

首先是一些虚拟数据:

df1 <- data.frame(name=c("George", "Abraham", "Barack"), stringsAsFactors = F)
df2 <- data.frame(president=c("Thanks, Obama (Barack)","Lincoln, Abraham, George""George Washington"), stringsAsFactors = F)

使用grep在完整描述中查找代码:

idx2 <- sapply(df1$name, grep, df2$president)

如果多个描述与代码匹配,这可能导致多个匹配,所以在这里我复制原始索引,以便结果对齐:

idx1 <- sapply(seq_along(idx2), function(i) rep(i, length(idx2[[i]])))

将数据集与cbind“合并”在新索引上对齐:

> cbind(df1[unlist(idx1),,drop=F], df2[unlist(idx2),,drop=F])
       name                president
1    George Lincoln, Abraham, George
1.1  George        George Washington
2   Abraham Lincoln, Abraham, George
3    Barack   Thanks, Obama (Barack)

0
投票

(你的问题有点模糊 - 用一些样本/ foobar数据会更好 - 所以不幸的是这个答案也是如此)

试试这个:

?grep                                       # Pattern Matching and Replacement
X <- data.frame(a = letters[1:10])
grep(pattern = "c", x = X$a)                # returns position of "c": 3
grepl(pattern = "c", x = X$a)               # returns a vector of bools: [ F F T F F ... ]
X[grepl(pattern = "c", x = X$a),"a") <- "C" # replaces "c" with "C"

PS:

  • 根据你的元素名称列表有多大/多脏,我经常发现它有用(i)创建一个干净的(简短的,明确的)名称字典,(ii)为每个原始列表添加一个带有这个新名称的新列(iii)用这些栏目执行merge;
  • 除了base::merge,我喜欢使用dplyrjoin函数(主要是因为我喜欢他们的cheat sheet);
© www.soinside.com 2019 - 2024. All rights reserved.