【问题标题】:For loops using grepl使用 grepl 的 for 循环
【发布时间】:2020-06-22 16:25:19
【问题描述】:

我正在尝试使用 for 循环遍历数据框,查看观察是否在列中包含某个字符串(即,它应该在列 Content 中包含“no law” ),并根据结果在不同的列中生成值。

如果它确实包含由grepl 函数的结果标识为True 的字符串,那么观察应该在Effectrp 中具有“Permissive”柱子;否则,它应该说“限制性”。

我不太确定我做错了什么...任何帮助将不胜感激!

for (i in 1:nrow(ldb)){
  if (grepl('no law', ldb$Content[i], ignore.case = TRUE)) == TRUE {
    ldb$Effectrp[i] = 'Permissive'
  } else {
    lab$EffectTR[i] = 'Restrictive'
  }
}

【问题讨论】:

    标签: r loops for-loop if-statement grepl


    【解决方案1】:

    你甚至不应该为此需要一个 for 循环,因为 grepl 如果应用于向量,将返回一个向量。您可以尝试类似

    ldb$Effectrp <- 'Restrictive'
    lbd$Effectrp[grepl('no law', ldb$Content, ignore.case = TRUE)] <- 'Permissive'
    

    (并且,如上一个答案中所述,请注意数据框和列名中的拼写错误。)

    【讨论】:

    • @MartinGal 哎呀,是的。谢谢。
    【解决方案2】:

    使用base R

    ldb$EffectRP <- sapply(ldb$Content, 
                           function(x) if (grepl("no law", x, ignore.case = TRUE)) {"Permissive"} else {"Restrictive"} )
    

    使用dplyrstringr

    ldb %>%
      mutate(EffectRP2 = ifelse(str_detect(Content, "no law"), "Permissive", "Restrictive"))
    

    这些选项返回:

       Content    EffectRP   EffectRP2
    1      law Restrictive Restrictive
    2   no law  Permissive  Permissive
    3      law Restrictive Restrictive
    4   no law  Permissive  Permissive
    5      law Restrictive Restrictive
    6      law Restrictive Restrictive
    7   no law  Permissive  Permissive
    8   no law  Permissive  Permissive
    9   no law  Permissive  Permissive
    10  no law  Permissive  Permissive
    

    【讨论】:

      【解决方案3】:

      与我写给this问题的答案类似。

      我能看到的唯一潜在问题是else 部分中的拼写错误。当您的数据框早些时候被命名为ldb 并且列被命名为Effectrp 时,您写了lab$EffectTR。不确定这是不是故意的。

      澄清冗余的事情:

      您的if 语句中不需要== TRUE。我是这样想的。现在你有:

      if (grepl(check if my pattern is found in Content) == TRUE) {
          do something
      }
      

      grepl 返回TRUE/FALSE,所以假设"no law"Content 中找到,然后grepl 计算结果为TRUE,产生:

      if (TRUE == TRUE) {
          do something
      }
      

      如果我们继续计算括号,我们确实知道TRUE == TRUE,所以这简化为:

      if (TRUE) {
          do something
      }
      

      这就是我们想要的。但是,当您可以像这样使用 grepl 的输出时,额外的检查 TRUE == TRUE 是不必要的:

      if (grepl(check if my pattern is found in Content) {
          do something
      }
      

      这将评估为:

      if (TRUE) {
          do something
      }
      

      与以前相同,但您跳过了多余的== TRUE 步骤。即 if 语句将运行,因为括号内的东西是 TRUE 在字面意义上。

      希望这更有意义!当我第一次学习它时,我也很困惑。

      【讨论】:

      • 你能澄清一下你说if(TRUE)的意思吗?我不太明白。另外,感谢您注意到拼写错误!
      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2016-10-21
      • 2016-02-15
      相关资源
      最近更新 更多