Поиск и форматирование строки - PullRequest
0 голосов
/ 12 октября 2018

Ниже приведены мои данные:

data

Так что в столбце описания моей деятельности у меня много обвинений.

Некоторые строки содержат шаблон, например, заряд, сборы или ничего.

Итак, во-первых, 1. Мне нужно найти для шаблон с именем заряда и заменить на заряды .

Но для 2 из сборов, названных сборы за контейнеры и складские сборы, мне нужно назвать сборы вместо сборов.Ex.Контейнерный сбор, а не контейнерный сбор.

Если шаблон с указанным зарядом отсутствует, мне нужно поместить сборы в конец строки.

Для Ques 1, я попробовал приведенный ниже код в R,

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

Но он заменил дополнительные s в выводе как Ex.Chargess.Я не знаю почему.

Для заданий 2 и 3 я не знаю, с чего начать.

Может кто-нибудь помочь мне в этом.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Попробуйте что-то вроде этого (может быть дополнительный вариант с строчными и прописными буквами, поэтому может потребоваться преобразование чего угодно в строчные буквы, включая шаблоны в коде):

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
0 голосов
/ 12 октября 2018

Все становится очень легко, когда вы разделяетесь на более мелкие проблемы.Здесь я создаю вектор 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"

В следующий раз попробуйте дать нам воспроизводимый пример, чтобы мы могли вам помочь.

0 голосов
/ 12 октября 2018

Во-первых, я настоятельно рекомендую использовать заголовки без пробелов (например, 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)
    }
}

Youможет затем установить исходный столбец, используя новый символьный вектор:

df$Activity_description <- new_column

Это может быть немного просто, так как это сделано в базе R, но это должно, по крайней мере, помочь вам начать.

...