【问题标题】:R update the order of strings separated by comma within a column based on a listR根据列表更新列中用逗号分隔的字符串的顺序
【发布时间】:2021-10-09 17:59:38
【问题描述】:

我有一个数据框,其中有一个名为 line_name 的列。 Line_name 具有用逗号分隔的字符串。 (例如“A、B、C”)

如果 pdl1_mono 列表中的任何字符串在 line_name 中,我希望该词出现在第一个。现在 Line_name 中的单词列表是按字母顺序排列的。基本上,我正在尝试更新 Line_name 列中字符串的顺序。

例如,如果 Line_name = "carboplatin,paclitaxel,pembrolizumab",由于 "pembrolizumab" 在 pdl1_mono 列表中,我想将其更新为 "pembrolizumab,carboplatin,paclitaxel"。

pdl1_mono <- c('atezolizumab', 'cemiplimab', 'durvalumab', 'nivolumab', 'nivolumab,ipilimumab',
               'pembrolizumab')

df <- df %>% 
        mutate(
            line_name = sub('^(.*),pembrolizumab', 'pembrolizumab,\\1', line_name),
            line_name = sub('^(.*),nivolumab', 'nivolumab,\\1', line_name)
        )

我可以使用 sub() 函数对 pdl1_mono 列表中的每个项目进行更新。我们可以使用一些动态函数来更新 Line_name 列,而不是手动重复每个项目吗?我尝试使用地图,但我认为这是不对的。一直报错

df1 <- df %>% 
     mutate(
         line_name = 
             case_when(str_detect(line_name, paste(pdl1_mono, collapse = "|")) ~ map(pdl1_mono, 
                                                                                     sub(paste0("^(.*),",.,"'"), paste0(.,",\\1"), line_name)),
                       TRUE ~.                          ))

这是用于测试的示例数据集

structure(list(patient_id = c("FB686A25501E9", "F8B1ED05646B2", 
"FC3D22E4CC73C", "F26230CDC7E74", "F22AF8C94E657", "FAF785C1A151A", 
"F6E1B8F6F0EA9", "F428FFA3E8E61", "F6B57AFAF6B24", "FA7560BD1D1AD", 
"FAAC879CAF38F", "F1C824D17FCB9", "F25182C921986", "F890B3306D38F", 
"FF26E35E93510", "FB4FB81ACD59D", "FA32928EF3D5B", "FA7D9EBBD7483", 
"FF3F362DE9D91", "F0BA038C8DD49"), line_name = c("bevacizumab,carboplatin,pemetrexed", 
"dabrafenib,trametinib", "gemcitabine,paclitaxel", "nivolumab", 
"carboplatin,paclitaxel protein-bound", "cisplatin,etoposide", 
"paclitaxel,pertuzumab,trastuzumab", "carboplatin,paclitaxel protein-bound,pembrolizumab", 
"carboplatin,gemcitabine", "afatinib,carboplatin,pembrolizumab,pemetrexed", 
"paclitaxel protein-bound", "bevacizumab,carboplatin,pemetrexed", 
"carboplatin,docetaxel", "cisplatin,etoposide", "carboplatin,paclitaxel protein-bound", 
"carboplatin,pemetrexed", "nivolumab", "afatinib", "carboplatin,paclitaxel", 
"bevacizumab,carboplatin,pemetrexed")), row.names = c(NA, -20L
), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • Rtistic 将它们分散到多行并将它们视为有序因子会更多。为什么他们需要在一个字符串中?
  • @coffeinjucky 这是一张大桌子的一部分。 Line_name 可能是一长串字符串。而且我必须按排序顺序将其显示在各种表格和图表中。
  • 我认为你想要%in% 而不是map,但我的dplyr 不是很好。

标签: r string dplyr


【解决方案1】:

请测试一下:

library(tidyverse)

re_do <- function(string, group){
  vec <- unlist(strsplit(string, ','))
  i <- which(vec %in% group)
  
  if(length(i)>0){
    new_vec <- paste0(c(vec[i], vec[-i]), collapse=',')  
    return(new_vec)
  }
  else{
    return(string)
  }

}


df %>% 
  rowwise() %>% 
  mutate(new_vec = re_do(line_name, pdl1_mono))

# A tibble: 20 x 3
# Rowwise: 
   patient_id    line_name                                          new_vec                                           
   <chr>         <chr>                                              <chr>                                             
 1 FB686A25501E9 bevacizumab,carboplatin,pemetrexed                 bevacizumab,carboplatin,pemetrexed                
 2 F8B1ED05646B2 dabrafenib,trametinib                              dabrafenib,trametinib                             
 3 FC3D22E4CC73C gemcitabine,paclitaxel                             gemcitabine,paclitaxel                            
 4 F26230CDC7E74 nivolumab                                          nivolumab                                         
 5 F22AF8C94E657 carboplatin,paclitaxel protein-bound               carboplatin,paclitaxel protein-bound              
 6 FAF785C1A151A cisplatin,etoposide                                cisplatin,etoposide                               
 7 F6E1B8F6F0EA9 paclitaxel,pertuzumab,trastuzumab                  paclitaxel,pertuzumab,trastuzumab                 
 8 F428FFA3E8E61 carboplatin,paclitaxel protein-bound,pembrolizumab pembrolizumab,carboplatin,paclitaxel protein-bound
 9 F6B57AFAF6B24 carboplatin,gemcitabine                            carboplatin,gemcitabine                           
10 FA7560BD1D1AD afatinib,carboplatin,pembrolizumab,pemetrexed      pembrolizumab,afatinib,carboplatin,pemetrexed     
11 FAAC879CAF38F paclitaxel protein-bound                           paclitaxel protein-bound                          
12 F1C824D17FCB9 bevacizumab,carboplatin,pemetrexed                 bevacizumab,carboplatin,pemetrexed                
13 F25182C921986 carboplatin,docetaxel                              carboplatin,docetaxel                             
14 F890B3306D38F cisplatin,etoposide                                cisplatin,etoposide                               
15 FF26E35E93510 carboplatin,paclitaxel protein-bound               carboplatin,paclitaxel protein-bound              
16 FB4FB81ACD59D carboplatin,pemetrexed                             carboplatin,pemetrexed                            
17 FA32928EF3D5B nivolumab                                          nivolumab                                         
18 FA7D9EBBD7483 afatinib                                           afatinib                                          
19 FF3F362DE9D91 carboplatin,paclitaxel                             carboplatin,paclitaxel                            
20 F0BA038C8DD49 bevacizumab,carboplatin,pemetrexed                 bevacizumab,carboplatin,pemetrexed                

【讨论】:

  • 由于 rowwise() 按行对输入进行分组,因此我必须在变异后 ungroup() ,但此解决方案确实有效。谢谢
  • 很高兴我能帮上忙。
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多