我对R比较陌生。我有一个名为RN
的字符变量,其文本需要根据{{{named_RN
和general_RN
的一些条件被提取为2个变量[RN
和named_RN
] 1}}。这就是期望的结果(目前,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
是空白的 - 我不知道如何编写这部分代码以及我需要帮助的内容!) :
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);
});
结尾,就像最后一行中的情况一样。
请告知。
谢谢!
答案 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"