Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R dplyr过滤器基于将搜索词与选择列中任何作品的第一个词相匹配_R_Regex_Dplyr - Fatal编程技术网

R dplyr过滤器基于将搜索词与选择列中任何作品的第一个词相匹配

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

我试图根据文本中以匹配特定正则表达式的单词开头的关键字来筛选选定列中的单词。在这里,我试图挑选所有以“bio”或“15”开头的单词。但是,搜索词也可以在一些词的中间找到,比如名称栏的共生体和代码列161540。p>
**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更新了答案。我刚刚意识到这只会在文章开头挑出一些词