根据R中的条件提取文本

时间:2017-06-19 23:04:29

标签: r regex text data-manipulation text-extraction

我对R比较陌生。我有一个名为RN的字符变量,其文本需要根据{{{named_RNgeneral_RN的一些条件被提取为2个变量[RNnamed_RN] 1}}。这就是期望的结果(目前,general_RNRN 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 是空白的 - 我不知道如何编写这部分代码以及我需要帮助的内容!) :

RN

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

我遇到的主要问题是我不能通过0 (0 [后一个0之前的空格来gsub,因为有时候RN代码会在{ named_RN中的文字与最后一行中的情况相同]因为0 (的某些代码以it('should handle CREATE_TYPE', () => { const initialState = { test: true }; const customType = { id: 'test-id' }; const action = { type: CREATE_TYPE, customType: customType, id: customType.id }; const result = reducer(initialState, action); const expectedResult = { test: true, [customType.id]: customType }; expect(result).toEqual(expectedResult); }); 结尾,就像最后一行中的情况一样。

请告知。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是一种方法。基本上,我创建了一个新列,其中匹配更容易检测。然后,我将括号内部与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

答案 1 :(得分:0)

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

首先命名为_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"