【问题标题】:R - modifying values columns depending on strings in same rowR - 根据同一行中的字符串修改值列
【发布时间】:2020-05-05 11:22:31
【问题描述】:

我是 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

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

【问题讨论】:

  • 如果PeptideSequence 包含UniMod:259UniMod:267 怎么办(如第3 行)?在这种情况下应该怎么做?你只有这两个值吗?你能显示给定数据的预期输出吗?
  • 在这种情况下,PrecursorMz 应该增加 (8 + 10)/3。对于这个库,我只有这两个值新值。库中还有一些其他 UniMod:XXX 字符串,但由于它们很常见,因此已将其考虑在内。

标签: r string dataframe


【解决方案1】:

使用来自stringrstringr::str_counttidyverse 的一部分)

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

【讨论】:

  • 亲爱的格雷格,感谢您的意见。当我在安装 tidyverse 后尝试您的解决方案时,我收到两条错误消息 In Ops.factor((8 * str_count(PeptideSequence, "UniMod:259") + 10 * : '/' 对因素没有意义。我也试过了将我的数据框转换为 tibble 但得到相同的结果。
  • @JWL 我添加了map_if(is.factor, as.character),它应该在factorcharacter 之间转换。如果您使用data.frame 制作数据框,您还可以设置stringsAsFactors = FALSE
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
相关资源
最近更新 更多