根据R中的条件提取文本
Extracting text based on condition in R
我对 R 比较陌生。我有一个名为 RN
的字符变量,其文本需要根据某些条件提取到 2 个变量 [named_RN
和 general_RN
] RN
。这就是想要的结果(现在,named_RN
和 general_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
我对 R 比较陌生。我有一个名为 RN
的字符变量,其文本需要根据某些条件提取到 2 个变量 [named_RN
和 general_RN
] RN
。这就是想要的结果(现在,named_RN
和 general_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