如何为R中字符串中的每个位置调用函数?

Posted

技术标签:

【中文标题】如何为R中字符串中的每个位置调用函数?【英文标题】:How to call a function for every position within a string in R? 【发布时间】:2021-12-19 09:12:10 【问题描述】:

正如我的问题所暗示的,我的任务是编写一个函数,该函数在向量的每个位置调用另一个函数。以下是我目前拥有的原始功能:

    find.TATA = function(k,s) 
     v = string.to.vec(s)
     i = v[k:(k+5)]
     TATA = "TATAAA"
     TATA.v = string.to.vec(TATA)
     return(all(i==TATA.v))
    

如您所见,该函数同时获取一个字符串(在本例中为 DNA 序列)和序列中的一个位置 (k),并根据“TATAAA”是否出现在位置 k 处返回 TRUE 或 FALSE。

我想知道如何编写第二个函数,在输入字符串的每个位置调用第一个函数 (1:995)。结果应该为每个位置返回 TRUE 或 FALSE。然后,我将使用一个虚拟变量修改该函数,以计算结果出现为 TRUE 的次数。提前致谢!

(附注:请尽量避免使用包中的内容,因为我们被告知要使用基本 R 功能解决此问题)

【问题讨论】:

k 可以从字符串中的每个位置开始 (1, 2, 3, ...) 还是每个位置 (1, 6, 11, ...) k 增加 5? 因此,由于要查找的“TATAAA”字符串长度为 6 个字符,因此该函数正在检查从位置 k 开始的 6 个元素的子向量。例如,如果 k =5,则检查位置 5 到 10 的函数以查看“TATAAA”是否出现在此范围内。希望对您有所帮助。 【参考方案1】:

这是一种相当原始的做事方式:

count.TATA <- function(string) 
  count <- 0
  for (i in 1:nchar(string)-5) 
    if (substr(string, i, i+5) == "TATAAA") 
      count <- count + 1
    
  
  return(count)

【讨论】:

效果很好,谢谢!作为跟进,我将如何将此函数应用于多个随机生成的字符串?例如,我有一个 random.dna(x) 函数,它返回一串长度为 x 的随机 dna 碱基,我想将你的函数应用于 1000 个这些 random.dna 字符串? 我假设您将这 1000 个字符串存储在某种列表或向量中?你可以试试sapply(random.dna.vec, count.TATA) 太好了,我会试一试的。非常感谢!

以上是关于如何为R中字符串中的每个位置调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何为PLSQL中的函数调用过程内部的更新表?

如何为调用 API 的方法编写 JUnit 测试?

如何为具有不同公式的多个 glm 调用仅加载一次数据?

如何为不和谐机器人调用异步函数

如何为每个 http 调用中的默认请求标头创建 axios 配置?

如何为 React Native 中调用的每次 onPress 函数提供自动增量?