【问题标题】:R: Loop should return numeric element from stringR:循环应该从字符串返回数字元素
【发布时间】:2020-09-19 20:32:33
【问题描述】:

我有一个问题,如何在 r 中编写一个循环来检查某个表达式是否出现在 string 中。所以我想检查表达式“i-sty”是否出现在我的变量中,对于 1:200 之间的每个 i,如果是这样,它应该给出相应的 i。

例如,如果我们有“4-sty”,则循环应该给我 4,如果变量中没有“i-sty”,它应该给我。用于观察。

我用过

for (i in 1:200){
  datafram$height <- ifelse(grepl("i-sty", dataframe$Description), i, ".")
}

但它没有工作。我实际上只获得积分。附上我展示了字符串变量的图片。 enter image description here

【问题讨论】:

  • "i-sty" 只是一个字符串,其中包含字母 i。要对变量i 使用正则表达式模式,您需要将一个字符串粘贴在一起,例如grepl(paste0(i, "-sty"), ...)。我还建议使用 NA 而不是 "." 作为“else”结果 - 这样生成的 height 变量可以是数字。
  • 欢迎来到Stack Overflow!请让您的示例可重现,阅读How to Askstackoverflow.com/questions/5963269/…
  • x &lt;- c("6-sty xxx", "4-sty yyyy", NA, "sty zzz", "32-sty xyz"); as.numeric(sub("^([0-9]+)-sty.*", "\\1", x))

标签: r string loops for-loop


【解决方案1】:

"i-sty" 只是一个包含字母i 的字符串。要对变量i 使用正则表达式模式,您需要将字符串粘贴在一起,例如grepl(paste0(i, "-sty"), ...)。我还建议使用 NA 而不是 "." 作为“else”结果 - 这样生成的 height 变量可以是数字。

for (i in 1:200){
  dataframe$height <- ifelse(grepl("i-sty", dataframe$Description), i, ".")
}

以上内容在语法上有效,但在逻辑上无效。您还有一个问题,即每次通过循环都覆盖height - 当i 为2 时,您会擦除i 为1 时的结果,当i 为3 时,您会擦除从何时开始的结果i 是 2... 我认为更好的方法是 extract 匹配,这很容易使用 stringr(但也可以在基础中)。作为一个好处,使用正确的模式,我们可以完全跳过循环:

library(stringr)

dataframe$height = str_match(string = dataframe$Description, pattern = "[0-9]+-sty")[, 2]
# might want to wrap in `as.numeric`

您同时使用dataframdataframe。我假设dataframe 是正确的。

【讨论】:

  • 非常感谢您的帮助。您提出的代码对我来说与 [, 1] 配合得很好。
猜你喜欢
  • 2019-02-20
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2018-03-24
  • 2013-10-26
  • 2019-07-11
相关资源
最近更新 更多