R中基于条件的文本提取

R中基于条件的文本提取,r,regex,text,data-manipulation,text-extraction,R,Regex,Text,Data Manipulation,Text Extraction,我对R比较陌生。我有一个名为RN的字符变量,根据RN上的一些条件,需要将其文本提取为两个变量[named\u RN和general\u RN]。这就是所需的结果(目前,命名的\u RN和常规\u RN为空-我不知道如何编写此部分,这就是我需要帮助的地方!): 如您所见,我试图提取括号内的信息。但是,如果代码为0,我想从RN提取到general\u RN,如果代码为非零,则提取到named\u RN >我遇到的主要问题是我不能按照 0(或 0( >前0中的空格,因为有时代码< 0代码>代码>在代

我对R比较陌生。我有一个名为
RN
的字符变量,根据
RN
上的一些条件,需要将其文本提取为两个变量[
named\u RN
general\u RN
]。这就是所需的结果(目前,
命名的\u RN
常规\u RN
为空-我不知道如何编写此部分,这就是我需要帮助的地方!):

如您所见,我试图提取括号内的信息。但是,如果代码为
0
,我想从
RN
提取到
general\u RN
,如果代码为非零,则提取到
named\u RN

<> >我遇到的主要问题是我不能按照<代码> 0(<代码>或<代码> 0(<代码> >前0中的空格,因为有时代码< 0代码>代码>在代码的中间开始,如在最后一行中的代码> RN<代码),因为一些代码< No.Eng> RN< <代码>结束,代码< > > 0。(与最后一行的情况相同

请告知


谢谢!

我确实使用了
gsub
,我还使用了
stringr
中的
string\u match\u all
要解决您提到的问题(代码可能包含0),您可以使用
\\b
断言来限制0不是较长字符串的一部分

首名

library(stringr)

## named_RN 
namedTemp = gsub("\\b0\\s+\\((.*?)\\)\\s*", "", RN)
namedTemp = sapply(str_extract_all(namedTemp, "\\([^\\)]+\\)"), 
            paste, collapse=", ")
(named_RN  = gsub("[()]", "", namedTemp))
[1] "Pentazocine" ""            "Amino"       "Amiodarone"
然后是将军

## general_RN 
generalTemp = sapply(str_extract_all(RN, "\\b0\\s+\\((.*?)\\)"), 
    paste, collapse=", ")
generalTemp = gsub("\\b0\\s+", "", generalTemp)
(general_RN = gsub("[()]", "", generalTemp))
[1] ""              "Complement C4" "Aminocap"      "Benzo, Ferri" 

这里有一种方法。基本上,我创建了一个新列,其中匹配项更容易检测。然后,我用
regmatches
匹配括号内的内容

df <- read.table(text="RN
'RP4A60D26L (Pentazocine)'
'0 (Complement C4)'
'0 (Aminocap) U6206 (Amino)'
'N3R30 (Amiodarone) 0 (Benzo) 0 (Ferri)'",header=TRUE,stringsAsFactors=FALSE)

df$RN_temp <- gsub("^[0] "," general_RN",df$RN) #replace leading 0s w/ general_RN
df$RN_temp <- gsub(" [0] "," general_RN",df$RN_temp) #replace other " 0 "
df$RN_temp <- gsub(" \\("," named_RN(",df$RN_temp) #replace rest w/ named_RN
df$RN_temp

df$named_RN <- regmatches(df$RN_temp,gregexpr("(?<=named_RN\\().*?(?=\\))",
                df$RN_temp, perl=TRUE))
df$general_RN <- regmatches(df$RN_temp,gregexpr("(?<=general_RN\\().*?(?=\\))", 
                  df$RN_temp, perl=TRUE))
df$RN_temp <- NULL
df

因此RN包含一个对列表,其中对的第一个元素为“0”或者别的什么,这对代码的第二个元素是插入项?当然,这是一种看待它的方式。它不是列表格式。它只是字符。哦,这几乎奏效了!除了一些
命名的\u RN
代码看起来像9002-68-0,在这种情况下,您的代码将其标记为
通用\u RN
,而不是
named_RN.
woah,这很有效!我也很喜欢你的算法。我需要更多地研究regmatches/gregexpr并彻底学习这些函数。所有的(?/*c(“苯并”,“铁”)或
字符(0)
如果它是空的。我怎样才能将它改为简单的
苯并、费里
和一个空字符串呢?不知道为什么我不能取消列表…不过我会多玩一会儿。我不能,例如
df$general\u RN hm,因为
命名的\u RN
它只保留每个列表的第一个元素,当我想保留所有元素时。对于
general>_RN
我在
$
df <- read.table(text="RN
'RP4A60D26L (Pentazocine)'
'0 (Complement C4)'
'0 (Aminocap) U6206 (Amino)'
'N3R30 (Amiodarone) 0 (Benzo) 0 (Ferri)'",header=TRUE,stringsAsFactors=FALSE)

df$RN_temp <- gsub("^[0] "," general_RN",df$RN) #replace leading 0s w/ general_RN
df$RN_temp <- gsub(" [0] "," general_RN",df$RN_temp) #replace other " 0 "
df$RN_temp <- gsub(" \\("," named_RN(",df$RN_temp) #replace rest w/ named_RN
df$RN_temp

df$named_RN <- regmatches(df$RN_temp,gregexpr("(?<=named_RN\\().*?(?=\\))",
                df$RN_temp, perl=TRUE))
df$general_RN <- regmatches(df$RN_temp,gregexpr("(?<=general_RN\\().*?(?=\\))", 
                  df$RN_temp, perl=TRUE))
df$RN_temp <- NULL
df
df$named_RN <- unlist(lapply(df$named_RN, function(x) ifelse(is.null(x), NA, x)))
df$general_RN <- unlist(df$general_RN)

'data.frame':   4 obs. of  3 variables:
 $ RN        : chr  "RP4A60D26L (Pentazocine)" "0 (Complement C4)" "0 (Aminocap) U6206 (Amino)" "N3R30 (Amiodarone) 0 (Benzo) 0 (Ferri)"
 $ named_RN  : chr  "Pentazocine" NA "Amino" "Amiodarone"
 $ general_RN: chr  "Complement C4" "Aminocap" "Benzo" "Ferri"
                                      RN    named_RN    general_RN
1               RP4A60D26L (Pentazocine) Pentazocine              
2                      0 (Complement C4)             Complement C4
3             0 (Aminocap) U6206 (Amino)       Amino      Aminocap
4 N3R30 (Amiodarone) 0 (Benzo) 0 (Ferri)  Amiodarone  Benzo, Ferri