Mutate从R中的字符串中删除所有括号(和内容)

Mutate从R中的字符串中删除所有括号(和内容),r,regex,stringr,mutate,R,Regex,Stringr,Mutate,我试图使用mutate/str_replace通过删除括号(包括内容)从“类”生成“表型”,但需要一些关于正则表达式的帮助吗? 然后,我还想对“显型”字符串中的文本进行重新排序,以便文本按PanCK>PD-L1>CD8>FoxP3>PD-1>CD68的顺序显示。 为非标准数据集道歉! 非常感谢 test<- data.frame(Class = c("FoxP3 (Opal 570): PanCK (Opal 690): PD-1 (Opal 620): CD68 (Opal 7

我试图使用mutate/str_replace通过删除括号(包括内容)从“类”生成“表型”,但需要一些关于正则表达式的帮助吗? 然后,我还想对“显型”字符串中的文本进行重新排序,以便文本按PanCK>PD-L1>CD8>FoxP3>PD-1>CD68的顺序显示。 为非标准数据集道歉! 非常感谢

test<- data.frame(Class = c("FoxP3 (Opal 570): PanCK (Opal 690): PD-1 (Opal 620): CD68 (Opal 780)"
, "CD8 (Opal 480): PanCK (Opal 690): CD68 (Opal 780): PD-L1 (Opal 520)", "PanCK (Opal 690): CD68 (Opal 780)", 
"FoxP3 (Opal 570): PanCK (Opal 690)"))
test这是否有效:

st <- c('PanCK','PD-L1','CD8','FoxP3','PD-1','CD68')
test %>% 
mutate(Phenotype = str_remove_all(Class, '\\s\\(Opal [0-9]{3}\\)')) %>% 
mutate(Phenotype = str_remove_all(Phenotype, '(\\s)')) %>% 
mutate(Phenotype_Ordered = str_split(Phenotype, ':')) %>% unnest(Phenotype_Ordered) %>% 
group_by(Class) %>% arrange(factor(Phenotype_Ordered, levels = st)) %>% 
mutate(Phenotype_Ordered = paste(Phenotype_Ordered, collapse = ':')) %>% distinct()
# A tibble: 4 x 3
# Groups:   Class [4]
  Class                                                                Phenotype             Phenotype_Ordered    
  <chr>                                                                <chr>                 <chr>                
1 FoxP3 (Opal 570): PanCK (Opal 690): PD-1 (Opal 620): CD68 (Opal 780) FoxP3:PanCK:PD-1:CD68 PanCK:FoxP3:PD-1:CD68
2 CD8 (Opal 480): PanCK (Opal 690): CD68 (Opal 780): PD-L1 (Opal 520)  CD8:PanCK:CD68:PD-L1  PanCK:PD-L1:CD8:CD68 
3 PanCK (Opal 690): CD68 (Opal 780)                                    PanCK:CD68            PanCK:CD68           
4 FoxP3 (Opal 570): PanCK (Opal 690)                                   FoxP3:PanCK           PanCK:FoxP3   
st%
突变(表型=str_remove_all(类,\\\s\\(蛋白石[0-9]{3}\\))%>%
突变(表型=str_移除所有(表型,(\\s))%>%
突变(表型有序=str分裂(表型,:)%%>%unnest(表型有序)%%>%
分组依据(类别)%>%排列(因子(表型排序,等级=st))%>%
突变(表型有序=粘贴(表型有序,折叠=':'))%>%distinct()
#一个tibble:4x3
#组别:班级[4]
类表型
1 FoxP3(蛋白石570):PanCK(蛋白石690):PD-1(蛋白石620):CD68(蛋白石780)FoxP3:PanCK:PD-1:CD68 PanCK:FoxP3:PD-1:CD68
2 CD8(蛋白石480):PanCK(蛋白石690):CD68(蛋白石780):PD-L1(蛋白石520)CD8:PanCK:CD68:PD-L1 PanCK:PD-L1:CD8:CD68
3 PanCK(蛋白石690):CD68(蛋白石780)PanCK:CD68 PanCK:CD68
4 FoxP3(蛋白石570):PanCK(蛋白石690)FoxP3:PanCK PanCK:FoxP3
这是否有效:

st <- c('PanCK','PD-L1','CD8','FoxP3','PD-1','CD68')
test %>% 
mutate(Phenotype = str_remove_all(Class, '\\s\\(Opal [0-9]{3}\\)')) %>% 
mutate(Phenotype = str_remove_all(Phenotype, '(\\s)')) %>% 
mutate(Phenotype_Ordered = str_split(Phenotype, ':')) %>% unnest(Phenotype_Ordered) %>% 
group_by(Class) %>% arrange(factor(Phenotype_Ordered, levels = st)) %>% 
mutate(Phenotype_Ordered = paste(Phenotype_Ordered, collapse = ':')) %>% distinct()
# A tibble: 4 x 3
# Groups:   Class [4]
  Class                                                                Phenotype             Phenotype_Ordered    
  <chr>                                                                <chr>                 <chr>                
1 FoxP3 (Opal 570): PanCK (Opal 690): PD-1 (Opal 620): CD68 (Opal 780) FoxP3:PanCK:PD-1:CD68 PanCK:FoxP3:PD-1:CD68
2 CD8 (Opal 480): PanCK (Opal 690): CD68 (Opal 780): PD-L1 (Opal 520)  CD8:PanCK:CD68:PD-L1  PanCK:PD-L1:CD8:CD68 
3 PanCK (Opal 690): CD68 (Opal 780)                                    PanCK:CD68            PanCK:CD68           
4 FoxP3 (Opal 570): PanCK (Opal 690)                                   FoxP3:PanCK           PanCK:FoxP3   
st%
突变(表型=str_remove_all(类,\\\s\\(蛋白石[0-9]{3}\\))%>%
突变(表型=str_移除所有(表型,(\\s))%>%
突变(表型有序=str分裂(表型,:)%%>%unnest(表型有序)%%>%
分组依据(类别)%>%排列(因子(表型排序,等级=st))%>%
突变(表型有序=粘贴(表型有序,折叠=':'))%>%distinct()
#一个tibble:4x3
#组别:班级[4]
类表型
1 FoxP3(蛋白石570):PanCK(蛋白石690):PD-1(蛋白石620):CD68(蛋白石780)FoxP3:PanCK:PD-1:CD68 PanCK:FoxP3:PD-1:CD68
2 CD8(蛋白石480):PanCK(蛋白石690):CD68(蛋白石780):PD-L1(蛋白石520)CD8:PanCK:CD68:PD-L1 PanCK:PD-L1:CD8:CD68
3 PanCK(蛋白石690):CD68(蛋白石780)PanCK:CD68 PanCK:CD68
4 FoxP3(蛋白石570):PanCK(蛋白石690)FoxP3:PanCK PanCK:FoxP3
另一个技巧是:

my_order <- c("CD68", "PD-1", "FoxP3", "CD8", "PD-L1", "PanCK")
test %>% 
  mutate(prototype = gsub('\\s*[(][^)]+[)]','',Class),
         ordered = map_chr(strsplit(prototype, '\\s*:\\s*'),
                      ~str_c(sort(ordered(.x,my_order), decreasing = TRUE), collapse = ":")))
                                                                 Class                prototype               ordered
1 FoxP3 (Opal 570): PanCK (Opal 690): PD-1 (Opal 620): CD68 (Opal 780) FoxP3: PanCK: PD-1: CD68 PanCK:FoxP3:PD-1:CD68
2  CD8 (Opal 480): PanCK (Opal 690): CD68 (Opal 780): PD-L1 (Opal 520)  CD8: PanCK: CD68: PD-L1  PanCK:PD-L1:CD8:CD68
3                                    PanCK (Opal 690): CD68 (Opal 780)              PanCK: CD68            PanCK:CD68
4                                   FoxP3 (Opal 570): PanCK (Opal 690)             FoxP3: PanCK           PanCK:FoxP3
我的订单%
变异(原型=gsub('\\s*[(][^)]+[)]','',类),
ordered=map_chr(strsplit(原型,\\s*:\\s*),
~str_c(排序(有序(.x,我的顺序),递减=TRUE),collapse=“:”)
类原型已订购
1 FoxP3(蛋白石570):PanCK(蛋白石690):PD-1(蛋白石620):CD68(蛋白石780)FoxP3:PanCK:PD-1:CD68 PanCK:FoxP3:PD-1:CD68
2 CD8(蛋白石480):PanCK(蛋白石690):CD68(蛋白石780):PD-L1(蛋白石520)CD8:PanCK:CD68:PD-L1 PanCK:PD-L1:CD8:CD68
3 PanCK(蛋白石690):CD68(蛋白石780)PanCK:CD68 PanCK:CD68
4 FoxP3(蛋白石570):PanCK(蛋白石690)FoxP3:PanCK PanCK:FoxP3
另一个技巧是:

my_order <- c("CD68", "PD-1", "FoxP3", "CD8", "PD-L1", "PanCK")
test %>% 
  mutate(prototype = gsub('\\s*[(][^)]+[)]','',Class),
         ordered = map_chr(strsplit(prototype, '\\s*:\\s*'),
                      ~str_c(sort(ordered(.x,my_order), decreasing = TRUE), collapse = ":")))
                                                                 Class                prototype               ordered
1 FoxP3 (Opal 570): PanCK (Opal 690): PD-1 (Opal 620): CD68 (Opal 780) FoxP3: PanCK: PD-1: CD68 PanCK:FoxP3:PD-1:CD68
2  CD8 (Opal 480): PanCK (Opal 690): CD68 (Opal 780): PD-L1 (Opal 520)  CD8: PanCK: CD68: PD-L1  PanCK:PD-L1:CD8:CD68
3                                    PanCK (Opal 690): CD68 (Opal 780)              PanCK: CD68            PanCK:CD68
4                                   FoxP3 (Opal 570): PanCK (Opal 690)             FoxP3: PanCK           PanCK:FoxP3
我的订单%
变异(原型=gsub('\\s*[(][^)]+[)]','',类),
ordered=map_chr(strsplit(原型,\\s*:\\s*),
~str_c(排序(有序(.x,我的顺序),递减=TRUE),collapse=“:”)
类原型已订购
1 FoxP3(蛋白石570):PanCK(蛋白石690):PD-1(蛋白石620):CD68(蛋白石780)FoxP3:PanCK:PD-1:CD68 PanCK:FoxP3:PD-1:CD68
2 CD8(蛋白石480):PanCK(蛋白石690):CD68(蛋白石780):PD-L1(蛋白石520)CD8:PanCK:CD68:PD-L1 PanCK:PD-L1:CD8:CD68
3 PanCK(蛋白石690):CD68(蛋白石780)PanCK:CD68 PanCK:CD68
4 FoxP3(蛋白石570):PanCK(蛋白石690)FoxP3:PanCK PanCK:FoxP3

删除paren及其内容是重复的-也许你可以在那里应用答案并编辑此问题以关注重新排序?你对正则表达式的想法是正确的,我认为你只需要将
str\u replace
(替换第一个匹配项)更改为
str\u replace\u all
(替换所有匹配项)。谢谢!我确实读过该线程,但是我看不出它是如何应用于单个字符串中的多个括号的-这是标准tidyverse示例之外的
str\u replace\u all
的一个很好的示例。删除paren及其内容是重复的-也许你可以在那里应用答案并编辑此问题以关注重新排序g?您对正则表达式的想法是正确的,我认为您只需要将
str\u replace
(替换第一个匹配项)更改为
str\u replace\u all
(替换所有匹配项)。谢谢!我确实读过那个帖子,但是我看不出它是如何应用于单个字符串中的多个括号的-这是标准tidyverse示例之外的一个很好的例子。
str_replace_all
。太棒了!为什么需要删除空白才能使用:
mutate(表型=str_remove_all(表型,(\\s))
Regex和
str\u replace\u all
也适用于这里的第一行:
test%>%mutate(表型=str\u replace\u all(类,“\”([^()]{0,}\”,“))
@JamesMonkman,刚刚查看了关于空格的预期输出。是的,一般来说,regex可以用不同的方式处理。太棒了!为什么需要删除空格才能使用:
突变(表型=str_remove_all(Phe
my_order <- c("CD68", "PD-1", "FoxP3", "CD8", "PD-L1", "PanCK")
test %>% 
  mutate(prototype = gsub('\\s*[(][^)]+[)]','',Class),
         ordered = map_chr(strsplit(prototype, '\\s*:\\s*'),
                      ~str_c(sort(ordered(.x,my_order), decreasing = TRUE), collapse = ":")))
                                                                 Class                prototype               ordered
1 FoxP3 (Opal 570): PanCK (Opal 690): PD-1 (Opal 620): CD68 (Opal 780) FoxP3: PanCK: PD-1: CD68 PanCK:FoxP3:PD-1:CD68
2  CD8 (Opal 480): PanCK (Opal 690): CD68 (Opal 780): PD-L1 (Opal 520)  CD8: PanCK: CD68: PD-L1  PanCK:PD-L1:CD8:CD68
3                                    PanCK (Opal 690): CD68 (Opal 780)              PanCK: CD68            PanCK:CD68
4                                   FoxP3 (Opal 570): PanCK (Opal 690)             FoxP3: PanCK           PanCK:FoxP3