【问题标题】:Search and format the string搜索并格式化字符串
【发布时间】:2018-10-12 12:25:36
【问题描述】:

下面是我的数据,

所以在我的活动描述栏中,我有很多费用。

某些字符串包含诸如charge、charges 或什么都没有的模式。

所以一开始, 1. 我需要找到名为charge的模式并替换为charges

  1. 但是对于名为 容器费用和存储费用的 2 项费用,我需要将其命名为费用而不是费用。前任。集装箱费不是集装箱费。

  2. 如果不存在名为 Charge 的模式,我需要在字符串末尾放置费用。

对于问题 1,我在 R 中尝试了以下代码,

    df$Activity description = gsub("*charge","charges",df$Activity description)

但是它将输出中的其他 s 替换为 Ex。收费。我不知道为什么。

对于问题2和3,我不知道如何开始。

谁能帮我解决这个问题。

【问题讨论】:

    标签: r data-transform


    【解决方案1】:

    首先,我强烈建议您使用不带空格的标题(例如 Activity_description)。

    接下来,您可能想要使用一系列 if-else 语句:

    new_column <- c()
    for (line in df$Activity_description){
        # check for the two specific cases
        if (line == "Container Tracking Charges"){
            new_column <- c(new_column, "Container Tracking Charge")
        } else if (line == "Store Tracking Charges"){
            new_column <- c(new_column, "Store Tracking Charge")
        } else if (grepl("Charge$", line)){
            new_column <- c(new_column, paste(line,"s",sep=""))
        } else if (! grepl("Charge", line)){
            new_column <- c(new_column, paste(line,"Charges"))
        } else {
            new_column <- c(new_column, line)
        }
    }
    

    然后您可以使用新的字符向量设置原始列:

    df$Activity_description <- new_column
    

    这可能有点简单,因为它是在基础 R 中完成的,但它至少应该让你开始。

    【讨论】:

      【解决方案2】:

      尝试这样的事情(可能有小写和大写的附加问题,因此将任何内容转换为小写 - 包括代码中的模式 - 可能是必要的):

      library(stringr)
      
      df <- data.frame(Activity_description=c(
         "Fuel Charge",
         "no Charges",
         "Container Charges",
         "Test"),stringsAsFactors=FALSE)
      
      df %>% mutate(Activity_description2=
        Activity_description %>% 
          str_replace("(Charge)\\b","\\1s") %>%
          str_replace("((Container|Store) +Charge)s?","\\1") %>%
          ifelse(str_detect(.,"Charge"),.,paste(.,"Charges"))
      )
      
      #  Activity_description Activity_description2
      #1          Fuel Charge          Fuel Charges
      #2           no Charges            no Charges
      #3    Container Charges      Container Charge
      #4                 Test          Test Charges
      

      【讨论】:

      • 这里我直接使用 df %>% mutate(df$Activity_description2= df$Activity_description %>% str_replace("(Charge)\\b","\\1s") %>% str_replace ("((Container|Store) +Charge)s?","\\1") %>% ifelse(str_detect(.,"Charge"),.,paste(.,"Charges"))。在那之后在 str_replace 中的“)”中说错误。似乎第三行中有一些括号错误。你能帮我解决这个问题吗?
      • 有 3 个右括号。
      【解决方案3】:

      当你分解成更小的问题时,事情变得非常容易。在这里,我正在创建 test 向量,您可以在代码中将其替换为 df$your.column

      test <- c("charge", "charges", "container charges", "store charges", "something else")
      

      首先你需要像这样定义不同的条件:

      haschargeandnotcharges <- grepl("charge", test) & !grepl("charges", test)
      hascontainerchargesorstorecharges <- grepl("container charge", test)|grepl("store charge", test)
      hasnocharge <- grepl("charge", test)
      

      然后你可以应用你的不同规则

      result <- ifelse(haschargeandnotcharges, gsub("charge", "charges", test), test) 
      result <- ifelse(hascontainerchargesorstorecharges, gsub("charges", "charge", result), result) 
      result <- ifelse(hascontainerchargesorstorecharges, gsub("charges", "charge", result), result) 
      result <- ifelse(hasnocharge, paste(result, "charges"), result) 
      
      rbind(test,result)
             [,1]      [,2]              [,3]                      
      test   "charge"  "charges"         "container charges"       
      result "charges" "charges charges" "container charge charges"
             [,4]                   [,5]                    
      test   "store charges"        "something else"        
      result "store charge charges" "something else charges"
      

      下次尝试请给我们一个可重现的示例,以便我们为您提供帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 2014-11-02
        • 2020-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多