【问题标题】:Is there an equivalent of vb.net's instr in RR中是否有相当于vb.net的instr
【发布时间】:2021-07-07 21:20:07
【问题描述】:

我正在用 R 重写我的 vb.net 代码,但遇到了障碍。 vb.net 中的代码本质上是计算字符串中未出现在允许字符的字符串中的字符数。 vb.net中的代码是:

StringtoConvert="ABC"
strAllowedChars="AC"
For i= 1 to len(StringtoConvert)
  If InStr(1, strAllowedChars, StringtoConvert(i))=0 then
  disallowed=disallowed+1
  Else
  End If
Next

我可以看到如何在 R 中使用循环来搜索字符串以查找每个允许的字符,但是在 R 中有没有办法使用像上面的 strAllowedChars 这样的聚合来做到这一点?

R 中 stringr 包的 str_count 函数是我发现的最接近的函数,但它看起来与整个 strAllowedChars 匹配,而不是单独查看每个字符。如何测试 StringtoConvert 以确保它仅包含 strAllowedChars 作为单个字符。换句话说,在上面的示例中,如果 StringtoConvert 中的字符与 strAllowedCharacters 中的字符之一不匹配,那么我需要将其标识为这样并使用另一个调用来替换它或直接替换它。

我试过的R代码是:

    library(stringr)
    testerstring<-"CYA"
    testpattern<-"CA"
    newtesterstring<-str_count(testerstring,testpattern)
    print(newtesterstring)

所需的输出是 StringtoConvert 中根据允许的字符 strAllowedChars 禁止的字符数。然后,我将在循环中使用它,使用 if then 语句将任何不允许的字符更改为“G”,因此如果我可以跳过计数步骤,而只是用“G”替换任何不允许的字符,那也是可取的。

【问题讨论】:

  • 您能否说明您的预期输出是什么?或者更好的是,正是您想要做的,而不仅仅是我们必须重现特定的视觉基本功能?
  • @IanCampbell 抱歉有任何歧义。我在问题的底部添加了一段,阐明了所需的输出是什么。

标签: r string instr


【解决方案1】:

这是str_replace_all 的一种方法。我们可以生成一个正则表达式来识别不在集合中的字符。例如,[^AC] 匹配任何不是AC 的字符:

library(stringr)
StringtoConvert="ABC"
strAllowedChars="AC"
str_replace_all(StringtoConvert,paste0("[^",strAllowedChars,"]"),"G")
#[1] "AGC"

set.seed(12345)
sample(LETTERS,50,replace = TRUE) %>% paste(collapse = "") -> StringtoConvert2
str_replace_all(StringtoConvert2,paste0("[^",strAllowedChars,"]"),"G")
#[1] "GGGGGGGGGGGGGGGGGGAGGGGGCGGGGGGGGGGGGGGGGGGGGGGGGG"

【讨论】:

  • 效果很好。我添加了一些其他的东西,但总的来说我从 VB.net 中的 22 行代码到 R 中的 8 行代码。
【解决方案2】:

您可以使用 strsplit 获取 strAllowedChars 中的每个字符,然后从 StringtoConvert 中的总字符数中减去 StringtoConvert 中允许的字符数。

这将为您提供 StringtoConvert 中不允许使用的字符的总数,如果这是您所追求的。

StringtoConvert <- "ABCrrrrr"
strAllowedChars <- "ACT"
disallowed <- nchar(StringtoConvert) - sum(stringr::str_count(StringtoConvert, strsplit(strAllowedChars,"")[[1]]))

disallowed

要将除允许字符之外的所有字符替换为“G”,您可以试试这个。

> StringtoConvert <- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
> strAllowedChars <- "ACT"
> 
> stringr::str_replace_all(StringtoConvert, paste0("[^", strAllowedChars, "]"), "G")
[1] "AGCGGGGGGGGGGGGGGGGTGGGGGG" 

【讨论】:

  • 有趣的是,两个人如何能够在基本相同的时间提出完全相同的方法。我猜想解决一个问题的最佳方法只有这么多。
  • @IanCampbell 我没有看到你的答案——在 OP 澄清了他们想要什么之后,我正在研究我的答案。我会删除我的以避免混淆。
  • 别误会我的意思,我完全相信你也有同样的想法。这事儿常常发生。从我的角度来看,无需对其进行编辑。
  • 两者都运行良好(显然),但@iancampbell 发布了他的第一个,所以我将把他的作为正确答案。我也会赞成你的。谢谢你们的帮助。
【解决方案3】:

仅使用 R 基础:

StringtoConvert="ABC"
strAllowedChars="AC"
Res=nchar(StringtoConvert)-sum(strsplit(StringtoConvert,"")[[1]] %in% strsplit(strAllowedChars,"")[[1]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2021-07-17
    • 2020-08-25
    相关资源
    最近更新 更多