R dplyr过滤器基于将搜索词与选择列中任何作品的第一个词相匹配
我试图根据文本中以匹配特定正则表达式的单词开头的关键字来筛选选定列中的单词。在这里,我试图挑选所有以“bio”或“15”开头的单词。但是,搜索词也可以在一些词的中间找到,比如名称栏的共生体和代码列161540。p>R dplyr过滤器基于将搜索词与选择列中任何作品的第一个词相匹配,r,regex,dplyr,R,Regex,Dplyr,我试图根据文本中以匹配特定正则表达式的单词开头的关键字来筛选选定列中的单词。在这里,我试图挑选所有以“bio”或“15”开头的单词。但是,搜索词也可以在一些词的中间找到,比如名称栏的共生体和代码列161540。p> **Name** **Code** Biofuel is good 159403 Bioecological is good 161540 Probiotics is good 159883 Good is
**Name** **Code**
Biofuel is good 159403
Bioecological is good 161540
Probiotics is good 159883
Good is symbiotic 1877447
我试过下面的代码
Innov_filter <- Innov_Data %>%
select(everything()) %>%
filter(str_detect(str_to_lower(Name), "bio") | str_detect(str_to_lower(Code), "bio"))
Innov_过滤器%
选择(所有内容())%>%
过滤器(str_-detect(str_-to_-lower(名称),“bio”)| str_-detect(str_-to_-lower(代码),“bio”))
但是,这不起作用,因为它正在过滤不符合任何条件的最后一行。我将感谢您的帮助,在严格的搜索基础上的第一次出现的搜索词的一部分,而不仅仅是在任何位置的词
感谢在您可以使用的行开头过滤“bio”,例如使用函数grepl()
:
grepl()
第一个参数^bio
中的^
指示匹配字符串必须以字母“bio”开头。
使用包stringr
,它将成为:
df %>%
filter(str_detect(tolower(Name), "^bio"))
#> Name Code
#> 1 Biofuel is good 159403
#> 2 Bioecological is good 161540
顺便说一下,在您的工作流中使用select(everything())
是可选的,因为默认情况下dplyr
保留所有列,并应用filter()
函数考虑所有列。要过滤行开头的“bio”,您可以使用例如函数grepl()
:
grepl()
第一个参数^bio
中的^
指示匹配字符串必须以字母“bio”开头。
使用包stringr
,它将成为:
df %>%
filter(str_detect(tolower(Name), "^bio"))
#> Name Code
#> 1 Biofuel is good 159403
#> 2 Bioecological is good 161540
顺便说一下,在您的工作流中使用
select(everything())
是可选的,因为默认情况下dplyr
保留所有列,并应用filter()
函数考虑所有列。可能类似于此,第一个单词是bio,代码中是15:
library(dplyr)
df %>%
filter(str_detect(tolower(Name), "^bio") | str_detect(tolower(Code), "15"))
Name Code
1 Biofuel is good 159403
2 Bioecological is good 161540
3 Probiotics is good 159883
使用重命名的数据:
df <-read.table(text = "Name Code
'Biofuel is good' 159403
'Bioecological is good' 161540
'Probiotics is good' 159883
'Good is symbiotic' 1877447", header = T)
df可能是这样的,第一个单词是bio,代码是15:
library(dplyr)
df %>%
filter(str_detect(tolower(Name), "^bio") | str_detect(tolower(Code), "15"))
Name Code
1 Biofuel is good 159403
2 Bioecological is good 161540
3 Probiotics is good 159883
使用重命名的数据:
df <-read.table(text = "Name Code
'Biofuel is good' 159403
'Bioecological is good' 161540
'Probiotics is good' 159883
'Good is symbiotic' 1877447", header = T)
df编辑
如果我们想选择任何以“bio”开头的单词,我们可以这样做
df %>%
filter(str_detect(str_to_lower(Name), "\\bbio") | str_detect(Code, "^15"))
df[sapply(strsplit(df$Name, "\\s+"), function(x) grepl("bio", tolower(x[1])))
| grepl("^15", df$Code), ]
# Name Code
#1 Biofuel is good 159403
#2 Bioecological is good 161540
#3 Probiotics is good 159883
或者在R底也一样
df[sapply(strsplit(df$Name, "\\s+"), function(x) any(grepl("^bio", tolower(x)))) |
grepl("^15", df$Code), ]
原始答案
这将选择Name
的第一个单词中出现“bio”的行(word(Name)
仅返回第一个单词)或以“15”开头的code
使用相同的逻辑,但以R为基数,我们可以
df %>%
filter(str_detect(str_to_lower(Name), "\\bbio") | str_detect(Code, "^15"))
df[sapply(strsplit(df$Name, "\\s+"), function(x) grepl("bio", tolower(x[1])))
| grepl("^15", df$Code), ]
# Name Code
#1 Biofuel is good 159403
#2 Bioecological is good 161540
#3 Probiotics is good 159883
在这里,它在空白处拆分字符串,然后从每个字符串中提取第一个单词(x[1]
),并检查其中是否有“bio”或获取以“15”开头的行。编辑
如果我们想选择任何以“bio”开头的单词,我们可以这样做
df %>%
filter(str_detect(str_to_lower(Name), "\\bbio") | str_detect(Code, "^15"))
df[sapply(strsplit(df$Name, "\\s+"), function(x) grepl("bio", tolower(x[1])))
| grepl("^15", df$Code), ]
# Name Code
#1 Biofuel is good 159403
#2 Bioecological is good 161540
#3 Probiotics is good 159883
或者在R底也一样
df[sapply(strsplit(df$Name, "\\s+"), function(x) any(grepl("^bio", tolower(x)))) |
grepl("^15", df$Code), ]
原始答案
这将选择Name
的第一个单词中出现“bio”的行(word(Name)
仅返回第一个单词)或以“15”开头的code
使用相同的逻辑,但以R为基数,我们可以
df %>%
filter(str_detect(str_to_lower(Name), "\\bbio") | str_detect(Code, "^15"))
df[sapply(strsplit(df$Name, "\\s+"), function(x) grepl("bio", tolower(x[1])))
| grepl("^15", df$Code), ]
# Name Code
#1 Biofuel is good 159403
#2 Bioecological is good 161540
#3 Probiotics is good 159883
在这里,它在空白处拆分字符串,然后从每个字符串中提取第一个单词(x[1]
),并检查其中是否有“bio”或获取以“15”开头的行。我们可以使用过滤所有与任何变量一起使用
df %>%
filter_all(any_vars(str_detect(str_to_lower(.), "^(bio|15)")))
# Name Code
#1 Biofuel is good 159403
#2 Bioecological is good 161540
#3 Probiotics is good 159883
注意:如果它是需要应用条件的列的子集,请在
如果我们需要在句子中选择任何以“Bio”开头的单词,请使用单词边界(\\b
)
数据
df我们可以使用filter\u all
和any\u vars
df %>%
filter_all(any_vars(str_detect(str_to_lower(.), "^(bio|15)")))
# Name Code
#1 Biofuel is good 159403
#2 Bioecological is good 161540
#3 Probiotics is good 159883
注意:如果它是需要应用条件的列的子集,请在
如果我们需要在句子中选择任何以“Bio”开头的单词,请使用单词边界(\\b
)
数据
df尝试“^bio”表示您只想查看开头,因此您想筛选Name
第一个单词中包含“bio”且code
以15开头的行?@RonakShah Yes。这就是我想在第一列的第一个单词或第一列中删除的内容?尝试“^bio”表示您只想查看开头,因此您希望筛选Name
在第一个单词中包含“bio”且code
以15开头的行?@RonakShah Yes。这就是我想在第一列的第一个单词中,或者在第一列中,多谢你对grepl()函数的进一步解释。我刚刚意识到这只会选择句子开头的单词。你知道我怎么能在句子的任何位置选择任何单词,只要它以Bio开头?e、 g这很好,因此在本例中可以使用特殊的char\b
,这是正则表达式(regex)中的单词边界。所以代码应该是过滤器(grepl(\\bbio),tolower(Name))
。您必须使用\\b
来转义反斜杠,否则它会被识别为常规反斜杠字符。感谢您对grepl()函数的进一步解释。我刚刚意识到这只会选择句子开头的单词。你知道我怎么能在句子的任何位置选择任何单词,只要它以Bio开头?e、 g这很好,因此在本例中可以使用特殊的char\b
,这是正则表达式(regex)中的单词边界。所以代码应该是过滤器(grepl(\\bbio),tolower(Name))
。您必须使用\\b
来转义反斜杠,否则它会被识别为常规反斜杠字符。我刚刚意识到这只会选择句子开头的单词。你知道我怎么能在句子的任何位置选择任何单词,只要它以Bio开头?e、 这是很好的生物燃料–@BayuoBlaise更新了答案。我刚刚意识到这只会在文章开头挑出一些词