【问题标题】:How can I replace a portion of text in a dataframe?如何替换数据框中的部分文本?
【发布时间】:2022-01-05 04:14:54
【问题描述】:

我正在尝试用不同的文本替换我的数据框中的部分文本。在“治疗”下,我需要用其他文本/或不同的隔离号替换它所说的“iso1”。但是,我需要保持 dillB 的状态,因为这是我的控制。我曾考虑拆分治疗列中的内容并将隔离编号设为新列,但我认为这可能比替换这些值更困难。

 Absorbance_t0 Absorbance_t1 row plateColumn   Treatment    Avg_t1   Avg_t0  norm_t0
1         1.163         0.388   A           1       dilLB 0.3626667 1.191667 1.191667
2         1.204         0.377   A           2       dilLB 0.3626667 1.191667 1.191667
3         1.208         0.323   A           3       dilLB 0.3626667 1.191667 1.191667
4         1.193         0.352   A           4 iso1_fullLB 0.4366667 1.219667 1.219667
5         1.235         0.438   A           5 iso1_fullLB 0.4366667 1.219667 1.219667
6         1.231         0.520   A           6 iso1_fullLB 0.4366667 1.219667 1.219667

我已经尝试过df[df == "iso1"] <- "iso22" 并且没有收到错误,但它并不能代替我需要的内容。

【问题讨论】:

    标签: r replace rename


    【解决方案1】:

    您也可以使用基础 R 中的gsub。基本上,您可以将下划线之前的所有内容替换为“iso22”。

    df$Treatment <- gsub(".*_", "iso22_", df$Treatment)
    

    输出

         Treatment
    1        dilLB
    2        dilLB
    3        dilLB
    4 iso22_fullLB
    5 iso22_fullLB
    6 iso22_fullLB
    7 iso22_fullLB
    

    但是,如果您在列中有其他下划线并且只想替换具有“iso1_”的下划线,那么您可以明确地使用文本。这只会替换该特定事件。

    df$Treatment <- gsub("^iso1_", "iso22_", df$Treatment)
    

    输出

          Treatment
    1         dilLB
    2         dilLB
    3         dilLB
    4  iso22_fullLB
    5  iso22_fullLB
    6  iso22_fullLB
    7 iso298_fullLB 
    

    使用tidyverse 将它们分成两列的另一个选项是使用separate。在这里,我使用_ 分成两列并使用fill = left 将非隔离物推入B 列。 mutate 语句适用于您只想保留 Isolate 列的数字。

    library(tidyverse)
    
    df %>% 
      separate(Treatment, c("Isolate","B"), sep = "_", fill = "left") %>% 
      mutate(Isolate = as.numeric(str_extract(Isolate, "[0-9]+")))
    

    输出

      Isolate      B
    1      NA  dilLB
    2      NA  dilLB
    3      NA  dilLB
    4       1 fullLB
    5       1 fullLB
    6       1 fullLB
    7     298 fullLB
    

    数据

    df <-
      structure(list(
        Treatment = c(
          "dilLB",
          "dilLB",
          "dilLB",
          "iso1_fullLB",
          "iso1_fullLB",
          "iso1_fullLB",
          "iso298_fullLB"
        )
      ),
      class = "data.frame",
      row.names = c(NA,-7L))
    

    【讨论】:

      【解决方案2】:

      我会使用 stringr 和 dplyr。您需要使用其中的文本来操作数据框列。您的代码会在数据框中查找与“iso1”完全匹配的单元格,这就是它找不到任何内容并执行任何操作的原因。

      library(stringr)
      library(dplyr)
      
      df <- df %>%
        mutate(
          firstbit = str_extract(Treatment, "[:alnum:]+(?=_)"),
          secondbit = str_extract(Treatment, "[:alnum:]+$")
        )
      

      这使用正则表达式来处理文本。它在 stringr 备忘单中进行了解释。 “[:alnum:]+”表示一个或多个字母或数字,“(?=_)”表示后跟一个下划线。 “$”表示后面跟字符串的结尾。

      https://stringr.tidyverse.org/

      【讨论】:

        猜你喜欢
        • 2021-07-22
        • 1970-01-01
        • 2012-01-05
        • 2015-06-25
        • 2021-01-24
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多