Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 返回单词在字符串中的位置_R_Regex_String - Fatal编程技术网

R 返回单词在字符串中的位置

R 返回单词在字符串中的位置,r,regex,string,R,Regex,String,我有这样的数据: data <- data.frame( text = c( "PARACETAMOL/CODEINE", "PSEUDOEPH/PARACET/CODEINE", "PARACETAMOL/CODEINE/DOXYLAMINE", "CODEINE & ASPIRIN", "CODEINE/PARACETAMOL", "TEST" ), stringsAsFactors = F ) 我更喜欢运行数百行的

我有这样的数据:

data <- data.frame(
  text = c(
    "PARACETAMOL/CODEINE",
    "PSEUDOEPH/PARACET/CODEINE",
    "PARACETAMOL/CODEINE/DOXYLAMINE",
    "CODEINE & ASPIRIN",
    "CODEINE/PARACETAMOL",
    "TEST"
  ),
  stringsAsFactors = F
)
我更喜欢运行数百行的DPLYR解决方案

我看了其他各种Stackoverflow答案,但我似乎无法让它工作。它们主要处理单词索引,而不是相对于其他单词的位置。一个想法是标记化,然后用类似tidytext的东西计算位置,但我认为可能有一种更简单的方法。我怀疑这是一些漂亮的正则表达式

更新

我忽略了添加一个非可待因元素,这两个元素都回答了错误


任何帮助都将不胜感激。

也许有一个直接的正则表达式解决方案可以帮助您实现这一点。下面是一种将字符串拆分为不同单词并计算可待因出现的单词数的方法

使用base R中的相同逻辑,这可以通过以下方式完成:

sapply(strsplit(data$text, "/|\\&"), function(x) 
         max(which(trimws(x) == "CODEINE")[1], 0, na.rm = TRUE))
#[1] 2 3 2 1 1 0

也许有一个直接的正则表达式解决方案可以帮助您实现这一点。下面是一种将字符串拆分为不同单词并计算可待因出现的单词数的方法

使用base R中的相同逻辑,这可以通过以下方式完成:

sapply(strsplit(data$text, "/|\\&"), function(x) 
         max(which(trimws(x) == "CODEINE")[1], 0, na.rm = TRUE))
#[1] 2 3 2 1 1 0

这不是最简单的解决方案,但您可以使用grep和strsplit。您可以添加一个ifelse语句来测试是否缺少值,如果是这样,则用0填充

总之,您可以编写如下内容:

图书馆弹琴 数据%>%行%>% mutatePosition=replace_naifelseis.nullgrepCODEINE,unlistrsplitext,/| \&,NA, grepCODEINE,unlistrsplitext,/| \&,0 来源:本地数据帧[7 x 2] 组: 一个tibble:7x2 文本位置 1对乙酰氨基酚/可待因2 2伪Eph/帕拉西特/可待因3 3对乙酰氨基酚/可待因/多胺2 4可待因和阿司匹林1 5可待因/扑热息痛1 6对位和可待因2 7测试0
这不是最简单的解决方案,但您可以使用grep和strsplit。您可以添加一个ifelse语句来测试是否缺少值,如果是这样,则用0填充

总之,您可以编写如下内容:

图书馆弹琴 数据%>%行%>% mutatePosition=replace_naifelseis.nullgrepCODEINE,unlistrsplitext,/| \&,NA, grepCODEINE,unlistrsplitext,/| \&,0 来源:本地数据帧[7 x 2] 组: 一个tibble:7x2 文本位置 1对乙酰氨基酚/可待因2 2伪Eph/帕拉西特/可待因3 3对乙酰氨基酚/可待因/多胺2 4可待因和阿司匹林1 5可待因/扑热息痛1 6对位和可待因2 7测试0
谢谢,真的很有帮助,但我忘了一些东西,请查看更新的问题和数据。@RUser您希望0作为职位还是NA可以?我希望0请确定。更新了答案。谢谢,真的很有帮助,但我忘记了一些东西,请查看更新的问题和数据。@RUser您希望0作为职位还是NA可以?我更喜欢0 pleaseOk。更新了答案。谢谢,非常简单和简短,但我忘了一些东西,请查看更新的问题和数据。我相应地编辑了我的答案。这可能不是最具前瞻性的解决方案,但它确实有效。让我知道这是你想要的汉克,非常简单和简短,但我忘了一些东西,请查看更新的问题和数据。我相应地编辑了我的答案。这可能不是最具前瞻性的解决方案,但它确实有效。让我知道这是你正在寻找的也许R的方法str_locate和str_locate_all,都采用参数string和pattern,可能有用。也许R的方法str_locate和str_locate_all都采用参数string和pattern,可能有用。
sapply(strsplit(data$text, "/|\\&"), function(x) 
         max(which(trimws(x) == "CODEINE")[1], 0, na.rm = TRUE))
#[1] 2 3 2 1 1 0