根据R中的条件提取文本

Extracting text based on condition in R

我对 R 比较陌生。我有一个名为 RN 的字符变量,其文本需要根据某些条件提取到 2 个变量 [named_RNgeneral_RN] RN。这就是想要的结果(现在,named_RNgeneral_RN 是空白的——我不知道如何编写这部分代码,这就是我需要帮助的地方!):

RN                                              named_RN         general_RN
RP4A60D26L (Pentazocine)                        Pentazocine
0 (Complement C4)                                                Complement C4
0 (Aminocap) U6206 (Amino)                      Amino            Aminocap
N3R30 (Amiodarone) 0 (Benzo) 0 (Ferri)          Amiodarone       Benzo, Ferri

如您所见,我正在尝试提取括号内的信息。但是,如果代码为 0,我想从 RN 提取到 general_RN,如果代码为非零,我想提取到 named_RN

我 运行 遇到的主要问题是我不能在后一个中的 0 之前通过 0 (0 ( [space gsub 因为有时 0 代码在 RN 中的文本中间开始,就像最后一行中的情况] 因为 named_RN 的一些代码以 0 ( 结尾,就像在最后一行。

请指教

谢谢!

虽然我确实使用了 gsub,但我也使用了 stringr 中的 string_match_all 包裹。要解决您提到的问题(代码可能包含 0),您可以只使用 \b 断言来限制 0 不是较长字符串的一部分。

第一个named_RN

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

## 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

编辑 改造成data.frame。我使用 lapply(df$named_RN, function(x) ifelse(is.null(x), NA, x)) 将缺失值 (NULL) 更改为 NA。

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