首页 > 解决方案 > 有没有办法检测一个字符串,然后在 R 中删除它的一个子集?

问题描述

我有一个非常大的数据集,我想从中检测一个特定的字符串,在整个评论的某个地方,然后从中删除空格。这是一个例子:

包含Happy Meal的字符串应替换为HappyMeal 或 包含芝士汉堡餐的字符串应替换为cheeseburgermeal

以下是我尝试过的所有方法:

1.

data %>% pull(body) %>%
  str_replace_all(c("happy meal" = "happymeal", "chicken nuggets meal" = "chickennuggetsmeal",
                  "chicken legend meal" = "chickenlegendmeal",
                  "double cheeseburger meal" = "doublecheeseburgermeal"))

上面的代码执行没有错误,所以我没有输出可以共享,但是当我检查数据集时,更改仍然不存在。 (编辑)分配后,我得到一长串 5000000 个字符,这不是我想要的,我希望正文中的各个评论保持分开。

2.

 str_remove(str_detect(("happy meal|chicken nuggets meal|chicken legend meal|double cheeseburger meal")), " ")

输出

Error in str_remove(., str_detect(("happy meal|chicken nuggets
meal|chicken legend meal|double cheeseburger meal")),  :   
unused argument (" ")
data$body <- str_remove(str_detect(data$body,
 ("happy meal|chicken nuggets meal|chicken legend meal|double cheeseburger meal")), " ")

此输出也会执行,但会将 body 中的所有值作为布尔值返回,我知道这是因为string _detect()返回一个布尔值。我尝试过的另一种方法是为整个正文字符串分配一个新变量,它只返回一个极长的字符串。我可能会犯一些非常愚蠢的错误,但是,我似乎无法弄清楚在获取没有空格的字符串时犯了什么错误,因此感谢您的帮助!

标签: r

解决方案


替换所有空格

如果要从列中的所有条目中删除空格,可以使用

# Load dplyr for `mutate()` and `%>%`
library(dplyr)

data %>%
  mutate(body = gsub(" ", "", body))

根据字符串长度替换

如果您只想在条目body大于一定数量的字符(例如 20)时应用上述内容,则可以执行以下操作:

data %>%
  mutate(body = ifelse(nchar(body > 20), gsub(" ", "", body), body))

仅替换一些空格

最后,如果您只想替换某些字符串中的一些空格,您可以使用(如您所建议的那样)。这也将替换子字符串,因此例如“买了一顿快乐餐和两杯草莓奶昔”将变成“买了一份快乐餐和两杯草莓奶昔”。stringr::str_replace_all()

replace_vals <- c("happy meal", "chicken nuggets meal", "chicken legend meal",
                  "double cheeseburger meal")

data %>%
  mutate(body = stringr::str_replace_all(
    string = body,
    # Values to replace
    pattern = replace_vals,
    # For replacements we can just remove the spaces from `replace_vals`
    replacement = gsub(" ", "", replace_vals)
  ))

保存结果

请注意,要将这些更改中的任何一个永久应用于您的,data您将需要重新分配结果。例如data <- data %>% # ...code that changes stuff


推荐阅读