R-根据同一行中的字符串修改值列

时间:2020-05-05 11:22:31

标签: r string dataframe

我是R的超级新手,很抱歉打扰您一个简单的问题。
我有一个很大的数据框(完整的数据框有25列和几百万行),其中包含肽谱库的信息(请参见下面的示例)。
我通过将缩写(UniMod:XXX)写到肽序列(PeptideSequence)中来将修饰引入基础库。我剩下的就是根据我的修饰和电荷(PrecursorCharge)的出现来更新肽质量(PrecursorMz)。因此,对于每个“(UniMod:259)”部分字符串,我必须将对应的质量增加8((UniMod:267)为10,再除以电荷(电荷并不总是3,对不起)。例如,修改第一行扣除序列中的修饰后,读取714.64876。

PrecursorMz PeptideSequence PrecursorCharge 709.31543 AAAEK(UniMod:259)LFGNMEGDCPSDWK(UniMod:259) 3 709.31543 AAAEKLFGNMEGDCPSDWK(UniMod:259) 3 529.58044 AK(UniMod:259)LWCSTTADYDR(UniMod:267) 3

非常感谢您,并将提供您可能需要的其他信息。

1 个答案:

答案 0 :(得分:0)

使用stringr::str_countstringr的一部分)中的tidyverse

library(tidyverse)

df %>%
map_if(is.factor, as.character) %>%
  mutate(
    PrecursorMz = PrecursorMz + (
      8 * str_count(PeptideSequence, "UniMod:259") + 10 * str_count(PeptideSequence, "UniMod:267")
    ) / PrecursorCharge,
    PrecursorMz = format(round(PrecursorMz, 5), nsmall = 5)
  )
# A tibble: 3 x 3
  PrecursorMz PeptideSequence                             PrecursorCharge
  <chr>       <chr>                                                 <dbl>
1 714.64876   AAAEK(UniMod:259)LFGNMEGDCPSDWK(UniMod:259)               3
2 711.98210   AAAEKLFGNMEGDCPSDWK(UniMod:259)                           3
3 535.58044   AK(UniMod:259)LWCSTTADYDR(UniMod:267)                     3