使用 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"} )
使用 dplyr
和 stringr
:
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
我正在尝试使用 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"} )
使用 dplyr
和 stringr
:
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