我有以下数据。
stringstosearch <- c("to", "and", "at", "from", "is", "of")
set.seed(199)
datatxt <- data.frame(id = c(rnorm(5)),
x = c("Contrary to popular belief, Lorem Ipsum is not simply random text.",
"A Latin professor at Hampden-Sydney College in Virginia",
"It has roots in a piece of classical Latin ",
"literature from 45 BC, making it over 2000 years old.",
"The standard chunk of Lorem Ipsum used since"))
我想要搜索列出的关键字stringtosearch
并为每个关键字创建包含结果的列。
我试过
library(stringr)
datatxt$result <- str_detect(datatxt$x, paste0(stringstosearch, collapse = '|'))
返回
> datatxt$result
[1] TRUE TRUE TRUE TRUE TRUE
然而,我正在寻找一种为每个单词创建一个布尔向量的方法stringstosearch
,即
id x to and at from is of
1 -1.9091427 Contrary to popular belief, Lorem Ipsum is not simply random text. TRUE FALSE FALSE FALSE TRUE TRUE
2 0.5551667 A Latin professor at Hampden-Sydney College in Virginia FALSE FALSE TRUE FALSE FALSE FALSE
3 -2.2163365 It has roots in a piece of classical Latin FALSE FALSE FALSE FALSE FALSE FALSE
4 0.4941455 literature from 45 BC, making it over 2000 years old. FALSE FALSE FALSE TRUE FALSE FALSE
5 -0.5805710 The standard chunk of Lorem Ipsum used since FALSE FALSE FALSE FALSE FALSE FALSE
知道如何实现这个吗?
这是基本的 R 单行代码。使用将单词边界锚点
sprintf()
添加到每个模式。这意味着,例如,不会匹配。然后使用 迭代这些模式,使用将每个模式与 匹配。这将返回一个逻辑向量列表,我们可以将其分配回数据框。\\b
"and"
"random"
lapply()
grepl()
datatxt$x
现在
datatxt
如愿了:tidyverse
方法正如您所标记的
tidyverse
,这里有一个替代方法。这将返回与使用函数的基本 R 方法相同的列表tidyverse
,只是它有名称。然后我们可以使用拼接运算符将其dplyr::mutate()
作为新列传递给:我认为基础 R 方法更加清晰。
我建议
Vectoriz[e]
使用pattern
以下论点stringfish::sf_grepl()
:给出
注意,我将
id
世代改为id = 1:5
。我有一个(不同的)
tidyverse
解决方案:此代码首先创建数据框,使用
!!!
运算符 from为stringstosearchtidyverse
向量中的每个元素创建一列。如果没有该函数,列名将被引号引起来。然后,我们遍历由stringstosearch元素确定的所有列。对于每一列,我们确定在调用 through 时检索到的列名是否存在于x列中,并在正则表达式中添加“\\b”以确定单词边界并防止误报(正如 SamR 指出的那样)。set_names()
mutate()
grepl()
cur_column()
现在
datatxt
输出:创建于 2024-11-13,使用reprex v2.0.2