使用 grepl 的循环

For loops using grepl

我正在尝试使用 for 循环 运行 通过数据框,查看观察是否在列中包含某个字符串(即,它应该在 [= 列中包含“无规律” 18=]内容),并根据结果在不同的列中生成值。

如果它确实包含由 grepl 函数的结果确定为 True 的字符串,则观察结果应该 'Permissive' Effectrp 列;否则,它应该说 'Restrictive'.

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

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'
  }
}

类似于我写给 问题的答案。

我能看到的唯一潜在问题是 else 部分的拼写错误。你写了 lab$EffectTR 之前你的数据框被命名为 ldb 并且列被命名为 Effectrp。不确定这是不是故意的。

对冗余事物的澄清:

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

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

grepl returns 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

希望这更有意义!我刚开始学的时候也是一头雾水

您甚至不需要为此使用 for 循环,因为 grepl 将 return 应用于矢量时将成为矢量。你可以试试

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

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

使用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"))

那些选项return:

   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