我试图使用for循环在数据框架中运行,查看一个观察是否包含列中的某个字符串(即,它应该包含列内容中的"no law“),并根据结果在另一列中生成值。
如果它确实包含由grepl函数的结果为True标识的字符串,那么该观察应该在Effectrp列中具有“允许的”;否则,它应该说“限制性”。
我不太确定我做错了什么..。任何帮助都将不胜感激!
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'
}
}发布于 2020-06-22 16:34:29
类似于我写给this问题的答案。
我能看到的唯一潜在问题是else部分的输入。您在前面编写lab$EffectTR时,您的数据文件名为ldb,列名为Effectrp。不知道这是不是故意的。
对冗余事物的澄清:
您不需要在== TRUE语句中使用if。我是这样想的。现在你有:
if (grepl(check if my pattern is found in Content) == TRUE) {
do something
}grepl返回TRUE/FALSE,因此假设在Content中找到了"no law",然后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。
希望这更有意义!当我第一次学到它的时候,我也很困惑。
发布于 2020-06-22 16:39:02
您甚至不需要for循环,因为如果应用到向量,grepl将返回一个向量。你可以试试
ldb$Effectrp <- 'Restrictive'
lbd$Effectrp[grepl('no law', ldb$Content, ignore.case = TRUE)] <- 'Permissive'(而且,正如前面的答案所提到的,请小心数据帧和列名中的输入。)
发布于 2020-06-22 16:45:43
使用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"))这些选项返回:
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 Permissivehttps://stackoverflow.com/questions/62519059
复制相似问题