【问题标题】:Place regex match from one column in to first column with NA by row将正则表达式匹配从一列到第一列,NA逐行
【发布时间】:2020-03-05 17:23:33
【问题描述】:

我有一个损坏的文件路径列表,在某些情况下,最后一个目录与文件名融合在一起(例如,DIR/analysis/filename.csvDIR/analysisfilename.csv)。我在/ 上创建了一个DF 拆分,需要从文件名中提取analysis 并将其放在具有NA 值的前一列中。

有没有办法在 R 中做到这一点?

这是我当前输入和所需输出的一个小例子

library(tidyverse)

dat <- structure(list(a = c("MOX", "MOX", "MOX", "MOX", "MOX", 
                            "MOX", "MOX", "MOX", "MOX", "MOX"), 
                      b = c("FFTF", "FFTF", "FFTF", "FFTF", "JOYO", 
                            "JOYO", "JOYO", "JOYO", "JOYO", "JOYO"), 
                      c = c("FO-2", "FO-2", "FO-2", "FO-2", "MK-I", 
                            "MK-I", "MK-I", "B14", "B14", "B14"), 
                      d = c("L09", "L09", "L09", "L09", NA, NA, NA, 
                            "PTM001", "PTM001", "PTM001"), 
                      e = c(NA_character_, NA_character_, NA_character_, 
                            NA_character_, NA_character_, NA_character_, 
                            NA_character_, NA_character_, NA_character_, 
                            NA_character_), 
                      f = c("analysisL09_1D_sampleJ", "analysisL09_1D_sampleH", 
                            "analysisL09_Multi-App_2DRZ", "analysisL09_2DRZ_new_bubble_gb_lim_DiffCoeff4_GrainGrowth", 
                            "analysisMK-I_50MW_new_bubble_gb_lim", "analysisMK-I_75MW_new_bubble_gb_lim", 
                            "analysisMK-I_50MW_old_bubble_gb_lim", "analysisB14_PTM001_1D_sample3_noAm", 
                            "analysisB14_PTM001_1D_sample1", "analysisB14_PTM001_1D_sample2")), 
                 row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

电流输出

dat
#> # A tibble: 10 x 6
#>    a     b     c     d      e     f                                             
#>    <chr> <chr> <chr> <chr>  <chr> <chr>                                         
#>  1 MOX   FFTF  FO-2  L09    <NA>  analysisL09_1D_sampleJ                        
#>  2 MOX   FFTF  FO-2  L09    <NA>  analysisL09_1D_sampleH                        
#>  3 MOX   FFTF  FO-2  L09    <NA>  analysisL09_Multi-App_2DRZ                    
#>  4 MOX   FFTF  FO-2  L09    <NA>  analysisL09_2DRZ_new_bubble_gb_lim_DiffCoeff4…
#>  5 MOX   JOYO  MK-I  <NA>   <NA>  analysisMK-I_50MW_new_bubble_gb_lim           
#>  6 MOX   JOYO  MK-I  <NA>   <NA>  analysisMK-I_75MW_new_bubble_gb_lim           
#>  7 MOX   JOYO  MK-I  <NA>   <NA>  analysisMK-I_50MW_old_bubble_gb_lim           
#>  8 MOX   JOYO  B14   PTM001 <NA>  analysisB14_PTM001_1D_sample3_noAm            
#>  9 MOX   JOYO  B14   PTM001 <NA>  analysisB14_PTM001_1D_sample1                 
#> 10 MOX   JOYO  B14   PTM001 <NA>  analysisB14_PTM001_1D_sample2
dat2 <- structure(list(a = c("MOX", "MOX", "MOX", "MOX", "MOX", 
                            "MOX", "MOX", "MOX", "MOX", "MOX"), 
                      b = c("FFTF", "FFTF", "FFTF", "FFTF", "JOYO", 
                            "JOYO", "JOYO", "JOYO", "JOYO", "JOYO"), 
                      c = c("FO-2", "FO-2", "FO-2", "FO-2", "MK-I", 
                            "MK-I", "MK-I", "B14", "B14", "B14"), 
                      d = c("L09", "L09", "L09", "L09", "analysis", "analysis", "analysis", 
                            "PTM001", "PTM001", "PTM001"), 
                      e = c("analysis", "analysis", "analysis", 
                            "analysis", NA_character_, NA_character_, 
                            NA_character_, "analysis", "analysis", 
                            "analysis"), 
                      f = c("L09_1D_sampleJ", "L09_1D_sampleH", 
                            "L09_Multi-App_2DRZ", "L09_2DRZ_new_bubble_gb_lim_DiffCoeff4_GrainGrowth", 
                            "MK-I_50MW_new_bubble_gb_lim", "MK-I_75MW_new_bubble_gb_lim", 
                            "MK-I_50MW_old_bubble_gb_lim", "B14_PTM001_1D_sample3_noAm", 
                            "B14_PTM001_1D_sample1", "B14_PTM001_1D_sample2")), 
                 row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

期望的输出

dat2
#> # A tibble: 10 x 6
#>    a     b     c     d        e        f                                        
#>    <chr> <chr> <chr> <chr>    <chr>    <chr>                                    
#>  1 MOX   FFTF  FO-2  L09      analysis L09_1D_sampleJ                           
#>  2 MOX   FFTF  FO-2  L09      analysis L09_1D_sampleH                           
#>  3 MOX   FFTF  FO-2  L09      analysis L09_Multi-App_2DRZ                       
#>  4 MOX   FFTF  FO-2  L09      analysis L09_2DRZ_new_bubble_gb_lim_DiffCoeff4_Gr…
#>  5 MOX   JOYO  MK-I  analysis <NA>     MK-I_50MW_new_bubble_gb_lim              
#>  6 MOX   JOYO  MK-I  analysis <NA>     MK-I_75MW_new_bubble_gb_lim              
#>  7 MOX   JOYO  MK-I  analysis <NA>     MK-I_50MW_old_bubble_gb_lim              
#>  8 MOX   JOYO  B14   PTM001   analysis B14_PTM001_1D_sample3_noAm               
#>  9 MOX   JOYO  B14   PTM001   analysis B14_PTM001_1D_sample1                    
#> 10 MOX   JOYO  B14   PTM001   analysis B14_PTM001_1D_sample2

reprex package (v0.3.0) 于 2020-03-05 创建

【问题讨论】:

    标签: r regex dplyr


    【解决方案1】:

    这是另一种方法。首先,将过滤以包含在f 中明确包含analysis 的数据,然后将其删除。接下来会使数据更长。对于每个文件路径,将analysis 放在第一个缺少的NA 值中。终于又变宽了。

    library(tidyverse)
    
    dat %>%
      dplyr::filter(grepl("analysis", f)) %>%
      mutate(f = str_remove(f, "analysis")) %>%
      mutate(rn = row_number()) %>%
      pivot_longer(cols = -rn, names_to = "path", values_to = "value") %>%
      group_by(rn) %>%
      mutate(value = if_else(min(which(is.na(value))) == row_number(), "analysis", value)) %>%
      pivot_wider(id_cols = rn, names_from = path, values_from = value)
    

    在基础 R 中,您也可以执行类似的操作:

    dat$f <- sub("analysis", "", dat$f)
    mat <- as.matrix(dat)
    mat[cbind(seq(nrow(mat)), max.col(is.na(mat), "first"))] <- "analysis"
    as.data.frame(mat)
    

    输出

    # A tibble: 10 x 7
    # Groups:   rn [10]
          rn a     b     c     d        e        f                                                
       <int> <chr> <chr> <chr> <chr>    <chr>    <chr>                                            
     1     1 MOX   FFTF  FO-2  L09      analysis L09_1D_sampleJ                                   
     2     2 MOX   FFTF  FO-2  L09      analysis L09_1D_sampleH                                   
     3     3 MOX   FFTF  FO-2  L09      analysis L09_Multi-App_2DRZ                               
     4     4 MOX   FFTF  FO-2  L09      analysis L09_2DRZ_new_bubble_gb_lim_DiffCoeff4_GrainGrowth
     5     5 MOX   JOYO  MK-I  analysis NA       MK-I_50MW_new_bubble_gb_lim                      
     6     6 MOX   JOYO  MK-I  analysis NA       MK-I_75MW_new_bubble_gb_lim                      
     7     7 MOX   JOYO  MK-I  analysis NA       MK-I_50MW_old_bubble_gb_lim                      
     8     8 MOX   JOYO  B14   PTM001   analysis B14_PTM001_1D_sample3_noAm                       
     9     9 MOX   JOYO  B14   PTM001   analysis B14_PTM001_1D_sample1                            
    10    10 MOX   JOYO  B14   PTM001   analysis B14_PTM001_1D_sample2 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2014-06-30
      • 2022-01-25
      • 2011-02-14
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多