我有两个数据帧:
第一种含有大量的蛋白质,我已经对这些蛋白质做了几次计算。这里有一个例子:
>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)
然而,蛋白质名称的命名在两个数据框架之间是不同的,使用合并函数这是行不通的。
那么,如果"TAF10“是”转录起始因子TFIID亚基10 OS=Mus musculus GN=Taf10 PE=1 SV=1 - TAF10_MOUSE“字符串的一部分,我该如何执行它的部分匹配呢?换句话说,我希望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“列)?
发布于 2016-01-11 14:07:51
这可能对您有用,它处理重复的:
首先,一些虚假的数据:
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)
发布于 2016-01-11 12:15:17
(你的问题有点含糊不清-如果有一些样本/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:
merge
;base::merge
之外,我喜欢使用dplyr
的join
函数(主要是因为我喜欢他们的备忘单);https://stackoverflow.com/questions/34720461
复制相似问题