Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 删除括号中的字符串并将其作为新列添加_Regex_R_Substring - Fatal编程技术网

Regex 删除括号中的字符串并将其作为新列添加

Regex 删除括号中的字符串并将其作为新列添加,regex,r,substring,Regex,R,Substring,可能重复 我有一个两列的数据框。我想删除括号中的字符串并将其作为新列添加。数据框显示在下面 structure(list(ID = 1:12, Gene.Name = structure(c(3L, 11L, 9L, 5L, 1L, 8L, 2L, 4L, 6L, 12L, 10L, 7L), .Label = c(" ATP synt, H+ tran, O subunit (oligomycin sensitivity conferring protein) (ATP5O),

可能重复

我有一个两列的数据框。我想删除括号中的字符串并将其作为新列添加。数据框显示在下面

      structure(list(ID = 1:12, Gene.Name = structure(c(3L, 11L, 9L, 
5L, 1L, 8L, 2L, 4L, 6L, 12L, 10L, 7L), .Label = c(" ATP synt, H+ tran, O subunit (oligomycin sensitivity conferring protein) (ATP5O), mRNA", 
" heterogeneous nuclear ribonucleoprotein F (HNRPF), mRNA", " NADH (ubiquinone) 1 alpha subcomplex, 4 (9kD, MLRQ) (NDUFA4), mRNA", 
" ribosomal protein L34 (RPL34), transcript variant 1, mRNA", 
" ribosomal protein S11 (RPS11), mRNA", "ATP synthase, H+ tran, mitochondrial F0, subunit c (subunit 9) isoform 3 (ATP5G3), mRNA", 
"clone MGC:10120 IMAGE:3900723, mRNA, complete cds", "cytidine monophosphate N-acetylneuraminic acid synthetase (CMAS), mRNA", 
"farnesyl-diphosphate farnesyltransferase 1 (FDFT1), mRNA", "homeobox protein from AL590526 (LOC84528), mRNA", 
"mitochondrial  S33 (MRPS33), transcript variant 1, nuclear gene, mRNA", 
"ribosomal protein S15a (RPS15A), mRNA"), class = "factor")), .Names = c("ID", 
"Gene.Name"), row.names = c(NA, -12L), class = "data.frame")
如果未找到括号中的字符串,则将该行留空。这里有两个箱子

1) 获取括号中的所有字符串并添加为一个新列,由

2) 括号中的最后一个字符串并添加为新列


我尝试了一些类似于
df$Symbol的方法,我想我采取了简单的方法,但是如果你能侥幸逃脱,只需匹配括号中看起来像基因符号的东西,即,只有大写字母和数字

dd <- structure(list(ID = 1:12, Gene.Name = structure(c(3L, 11L, 9L, 5L, 1L, 8L, 2L, 4L, 6L, 12L, 10L, 7L), .Label = c(" ATP synt, H+ tran, O subunit (oligomycin sensitivity conferring protein) (ATP5O), mRNA", " heterogeneous nuclear ribonucleoprotein F (HNRPF), mRNA", " NADH (ubiquinone) 1 alpha subcomplex, 4 (9kD, MLRQ) (NDUFA4), mRNA", " ribosomal protein L34 (RPL34), transcript variant 1, mRNA", " ribosomal protein S11 (RPS11), mRNA", "ATP synthase, H+ tran, mitochondrial F0, subunit c (subunit 9) isoform 3 (ATP5G3), mRNA", "clone MGC:10120 IMAGE:3900723, mRNA, complete cds", "cytidine monophosphate N-acetylneuraminic acid synthetase (CMAS), mRNA", "farnesyl-diphosphate farnesyltransferase 1 (FDFT1), mRNA", "homeobox protein from AL590526 (LOC84528), mRNA", "mitochondrial  S33 (MRPS33), transcript variant 1, nuclear gene, mRNA", "ribosomal protein S15a (RPS15A), mRNA"), class = "factor")), .Names = c("ID", "Gene.Name"), row.names = c(NA, -12L), class = "data.frame")


dd$Gene.Name <- as.character(dd$Gene.Name)

## case 1
mm <- gregexpr('(?<=\\()(.*?)(?=\\))', dd$Gene.Name, perl = TRUE)
mm <- regmatches(dd$Gene.Name, mm)


dd <- cbind(dd, case1 = sapply(mm, function(x)
  ifelse(length(x), paste(x, collapse = ', '), NA)))
dd[, c(1,3)]

#    ID                                            case1
# 1   1                    ubiquinone, 9kD, MLRQ, NDUFA4
# 2   2                                           MRPS33
# 3   3                                            FDFT1
# 4   4                                            RPS11
# 5   5 oligomycin sensitivity conferring protein, ATP5O
# 6   6                                             CMAS
# 7   7                                            HNRPF
# 8   8                                            RPL34
# 9   9                                subunit 9, ATP5G3
# 10 10                                           RPS15A
# 11 11                                         LOC84528
# 12 12                                             <NA>

## case 2
mm <- gregexpr('(?<=\\()([A-Z0-9]+)(?=\\))', dd$Gene.Name, perl = TRUE)
mm <- regmatches(dd$Gene.Name, mm)


dd <- cbind(dd, case2 = sapply(mm, function(x) ifelse(length(x), x, NA)))
dd[, c(1,4)]

#    ID    case2
# 1   1   NDUFA4
# 2   2   MRPS33
# 3   3    FDFT1
# 4   4    RPS11
# 5   5    ATP5O
# 6   6     CMAS
# 7   7    HNRPF
# 8   8    RPL34
# 9   9   ATP5G3
# 10 10   RPS15A
# 11 11 LOC84528
# 12 12     <NA>

dd使用
sub
获取字符串末尾圆括号内的单词的选项

 Symbol <- sub('.*\\(([^\\)]+)\\)[^\\(]+$', '\\1',df1[,2])
 df1$Symbol <- Symbol[1:nrow(df1)*NA^(!grepl('\\(',df1[,2]))]
 df1$Symbol
 #[1] "NDUFA4"   "MRPS33"   "FDFT1"    "RPS11"    "ATP5O"    "CMAS"    
 #[7] "HNRPF"    "RPL34"    "ATP5G3"   "RPS15A"   "LOC84528" NA   

@akrun可能是,但我在这里提到了两个案例,我只是想展示案例2的输出。R3.1.2可用的
qdapRegex
可以正常工作,而不是
(9kD,MLRQ)
给出了
9kD,MLRQ
正确的结果。抱歉打扰了。你检查过更新的问题了吗,案例1输出了很多汉克斯。完美。@Hashim我认为案例1更加直截了当,请参见编辑
dd <- structure(list(ID = 1:12, Gene.Name = structure(c(3L, 11L, 9L, 5L, 1L, 8L, 2L, 4L, 6L, 12L, 10L, 7L), .Label = c(" ATP synt, H+ tran, O subunit (oligomycin sensitivity conferring protein) (ATP5O), mRNA", " heterogeneous nuclear ribonucleoprotein F (HNRPF), mRNA", " NADH (ubiquinone) 1 alpha subcomplex, 4 (9kD, MLRQ) (NDUFA4), mRNA", " ribosomal protein L34 (RPL34), transcript variant 1, mRNA", " ribosomal protein S11 (RPS11), mRNA", "ATP synthase, H+ tran, mitochondrial F0, subunit c (subunit 9) isoform 3 (ATP5G3), mRNA", "clone MGC:10120 IMAGE:3900723, mRNA, complete cds", "cytidine monophosphate N-acetylneuraminic acid synthetase (CMAS), mRNA", "farnesyl-diphosphate farnesyltransferase 1 (FDFT1), mRNA", "homeobox protein from AL590526 (LOC84528), mRNA", "mitochondrial  S33 (MRPS33), transcript variant 1, nuclear gene, mRNA", "ribosomal protein S15a (RPS15A), mRNA"), class = "factor")), .Names = c("ID", "Gene.Name"), row.names = c(NA, -12L), class = "data.frame")


dd$Gene.Name <- as.character(dd$Gene.Name)

## case 1
mm <- gregexpr('(?<=\\()(.*?)(?=\\))', dd$Gene.Name, perl = TRUE)
mm <- regmatches(dd$Gene.Name, mm)


dd <- cbind(dd, case1 = sapply(mm, function(x)
  ifelse(length(x), paste(x, collapse = ', '), NA)))
dd[, c(1,3)]

#    ID                                            case1
# 1   1                    ubiquinone, 9kD, MLRQ, NDUFA4
# 2   2                                           MRPS33
# 3   3                                            FDFT1
# 4   4                                            RPS11
# 5   5 oligomycin sensitivity conferring protein, ATP5O
# 6   6                                             CMAS
# 7   7                                            HNRPF
# 8   8                                            RPL34
# 9   9                                subunit 9, ATP5G3
# 10 10                                           RPS15A
# 11 11                                         LOC84528
# 12 12                                             <NA>

## case 2
mm <- gregexpr('(?<=\\()([A-Z0-9]+)(?=\\))', dd$Gene.Name, perl = TRUE)
mm <- regmatches(dd$Gene.Name, mm)


dd <- cbind(dd, case2 = sapply(mm, function(x) ifelse(length(x), x, NA)))
dd[, c(1,4)]

#    ID    case2
# 1   1   NDUFA4
# 2   2   MRPS33
# 3   3    FDFT1
# 4   4    RPS11
# 5   5    ATP5O
# 6   6     CMAS
# 7   7    HNRPF
# 8   8    RPL34
# 9   9   ATP5G3
# 10 10   RPS15A
# 11 11 LOC84528
# 12 12     <NA>
 Symbol <- sub('.*\\(([^\\)]+)\\)[^\\(]+$', '\\1',df1[,2])
 df1$Symbol <- Symbol[1:nrow(df1)*NA^(!grepl('\\(',df1[,2]))]
 df1$Symbol
 #[1] "NDUFA4"   "MRPS33"   "FDFT1"    "RPS11"    "ATP5O"    "CMAS"    
 #[7] "HNRPF"    "RPL34"    "ATP5G3"   "RPS15A"   "LOC84528" NA   
 library(qdapRegex)
 df1$allSymbol <-  sapply(rm_round(df1[,2],extract=TRUE), function(x) {
                         indx <- grep(',', x)
                        x[indx] <-paste0("(", x[indx], ")")
                         toString(x)})

 is.na(df1$allSymbol) <- df1$allSymbol=='NA'
 df1[3:4]
 #                                          allSymbol   Symbol
 #1                   ubiquinone, (9kD, MLRQ), NDUFA4   NDUFA4
 #2                                            MRPS33   MRPS33
 #3                                             FDFT1    FDFT1
 #4                                             RPS11    RPS11
 #5  oligomycin sensitivity conferring protein, ATP5O    ATP5O
 #6                                              CMAS     CMAS
 #7                                             HNRPF    HNRPF
 #8                                             RPL34    RPL34
 #9                                 subunit 9, ATP5G3   ATP5G3
 #10                                           RPS15A   RPS15A
 #11                                         LOC84528 LOC84528
 #12                                             <NA>     <NA>