搜索并格式化字符串

时间:2018-10-12 12:25:37

标签: r data-transform

下面是我的数据,

Data

因此,在“活动描述”列中,我有很多费用。

某些字符串包含电荷,费用或什么都不包含的模式。

首先, 1.我需要找到命名为费用的模式并替换为费用

  1. 但是对于名为容器费和存储费的2种费用,我需要命名为费用而不是费用。例如集装箱收费而不是集装箱收费。

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

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

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

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

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

有人可以帮我吗?

3 个答案:

答案 0 :(得分: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

这可能有点简单,因为它是在base R中完成的,但至少应该可以让您入门。

答案 1 :(得分:1)

尝试类似的操作(可能会有一个带有小写和大写字母的附加isue,因此可能需要将任何内容转换为小写形式(包括代码中的模式)):

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

答案 2 :(得分:0)

当您分解成较小的问题时,事情变得很容易。在这里,我正在创建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"

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