搜索并格式化字符串
Search and format the string
下面是我的数据,
所以在我的 activity 描述栏中我有很多费用。
一些字符串包含诸如 charge、charges 或nothing 之类的模式。
所以一开始,
1. 我需要找到名为 charge 的 模式并替换为 charges.
但是对于名为 集装箱费用和商店费用的 2 项费用,我需要将其命名为费用而不是费用。前任。集装箱费不是集装箱费。
如果不存在名为 charge 的模式,我需要将 charges 放在字符串的末尾。
对于问题 1,我在 R 中尝试了以下代码,
df$Activity description = gsub("*charge","charges",df$Activity description)
但是它将输出中的附加 s 替换为 Ex。收费。我不知道为什么。
问题2和3,我不知道如何开始。
谁能帮我解决这个问题。
首先,我强烈建议您使用不带空格的 headers(例如 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"
下次尝试请给我们一个可重现的例子,以便我们可以帮助你。
下面是我的数据,
所以在我的 activity 描述栏中我有很多费用。
一些字符串包含诸如 charge、charges 或nothing 之类的模式。
所以一开始, 1. 我需要找到名为 charge 的 模式并替换为 charges.
但是对于名为 集装箱费用和商店费用的 2 项费用,我需要将其命名为费用而不是费用。前任。集装箱费不是集装箱费。
如果不存在名为 charge 的模式,我需要将 charges 放在字符串的末尾。
对于问题 1,我在 R 中尝试了以下代码,
df$Activity description = gsub("*charge","charges",df$Activity description)
但是它将输出中的附加 s 替换为 Ex。收费。我不知道为什么。
问题2和3,我不知道如何开始。
谁能帮我解决这个问题。
首先,我强烈建议您使用不带空格的 headers(例如 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"
下次尝试请给我们一个可重现的例子,以便我们可以帮助你。