Поиск и форматирование строки
Вот мои данные ниже,
Таким образом, в моей колонке описания деятельности у меня много обвинений.
Некоторые строки содержат шаблон, например, заряд, сборы или ничего.
Итак, во-первых, 1. Мне нужно найти шаблон под названием заряд и заменить на заряды.
Но для 2 из сборов, названных сбором за контейнер и сбором с магазина, мне нужно указать в качестве сбора вместо сборов. Ex. Контейнерный сбор, а не контейнерный сбор.
Если шаблон с именем заряда отсутствует, мне нужно поместить заряды в конец строки.
Для Ques 1, я попробовал ниже код в R,
df$Activity description = gsub("*charge","charges",df$Activity description)
Но он заменяет дополнительные s на выходе как Ex. Chargess. Я не знаю почему.
Для вопросов 2 и 3, я не знаю, как начать.
Может ли кто-нибудь помочь мне в этом.
3 ответа
Во-первых, я настоятельно рекомендую вам использовать заголовки без пробелов (например, 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, но это, по крайней мере, должно помочь вам начать.
Попробуйте что-то вроде этого (может быть дополнительный вариант с строчными и прописными буквами, поэтому может потребоваться преобразование чего угодно в строчные буквы, включая шаблоны в коде):
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
Все становится очень легко, когда вы разделяетесь на более мелкие проблемы. Здесь я создаю 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"
В следующий раз попробуйте дать нам воспроизводимый пример, чтобы мы могли вам помочь.