如何在R中从字符串中删除特定长度的单词?

6
我希望您能够删除字符串中长度小于3的单词。例如,我的输入是:
str<- c("hello RP have a nice day")

我希望我的输出是什么。
str<- c("hello have nice day")

请帮忙


1
最好不要使用str作为变量名。str是R的内置函数。 - Ven Yao
gsub(' . | .. ', ' ', s) - rawr
4个回答

12

试试这个:

gsub('\\b\\w{1,2}\\b','',str)
[1] "hello  have  nice day"

编辑 \b是单词边界。如果需要去除额外的空格,请将其更改为:

gsub('\\b\\w{1,2}\\s','',str)

或者

gsub('(?<=\\s)(\\w{1,2}\\s)','',str,perl=T)

2
也许可以添加一些关于正则表达式是如何工作的解释?可能需要解释一下正则表达式的作用? - hrbrmstr
1
我喜欢使用基本R语言的方法。但是这三种解决方案都存在以下三个“错误”之一:(1)当通过减号连接到更长的子字符串时(如“共选择”),删除长度为1或2的子字符串;(2)不删除字符串末尾的长度为1或2的子字符串;(3)不删除字符串开头的子字符串。第一种解决方案犯了第一个错误,第二种解决方案犯了第二个错误,第三种解决方案则犯了第二个和第三个错误。我该如何不犯这些错误? - hyco

3

或者使用str_extract_all提取所有长度大于等于3的单词和paste

library(stringr)
paste(str_extract_all(str, '\\w{3,}')[[1]], collapse=' ')
#[1] "hello have nice day"

当我尝试这样做时,出现了一个错误:SubConsolData$ProductTitle <- paste(str_extract_all(SubConsolData$ProductTitle, '\\w{3,}')[[1]], collapse=' ')。错误是DF(SubConsolData)的第一行被重复到DF的所有其他行中。 - LeMarque
1
@I_m_LeMarque 这是因为我们提取了第一个元素[[1]]。在这种情况下,只有一个字符串。在您的情况下,您可能需要循环然后执行paste操作。 - akrun

3

这里提供一种方法,使用我与@hwnd(SO正则表达式大师)共同编写的qdapRegex包中的rm_nchar_words函数。这里展示了删除1-2个字母单词和1-3个字母单词的示例:

str<- c("hello RP have a nice day")

library(qdapTools)

rm_nchar_words(str, "1,2")
## [1] "hello have nice day"

rm_nchar_words(str, "1,3")
## [1] "hello have nice"

qdapRegex旨在教授正则表达式,以下是S函数背后的正则表达式,它将1,2放入量词花括号中:

S("@rm_nchar_words", "1,2")
##  "(?<![\\w'])(?:'?\\w'?){1,2}(?![\\w'])"

2
x <- "hello RP have a nice day"
z <- unlist(strsplit(x, split=" "))
paste(z[nchar(z)>=3], collapse=" ")
# [1] "hello have nice day"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接