使用mutate函数创建新变量筛选含至少4个单词的推文遇阻
解决方法:筛选单词数≥4的推文
我来帮你搞定这个问题!你的代码主要有两个小问题:管道操作的语法错误,以及正则表达式的逻辑不够准确。下面一步步给你修正和优化:
先分析原代码的问题
- 管道语法错误:用
%>%传递数据框后,mutate里不需要再写tweets_son.df = ...,直接定义新变量名即可,比如has_enough_words = ...。 - 正则表达式逻辑偏差:你写的正则试图匹配“4个带标点的单词+空格+最后一个单词”,但这种写法会漏掉很多场景(比如单词间只有空格、带撇号的单词等),而且用
str_detect判断单词数不如直接统计更可靠。
推荐方案:用str_count统计单词数(直观易维护)
这种方法直接统计文本中的单词数量,逻辑清晰,还能顺便保留单词数变量方便后续分析:
library(dplyr) library(stringr) # 第一步:创建新变量,标记是否满足≥4个单词,同时可选保留单词数 new_tweets_son.df <- tweets_son.df %>% mutate( # 统计单词数(支持带撇号的单词,比如don't、Mary's) word_count = str_count(mysontweets, "\\b[[:alpha:]]+(?:['’][[:alpha:]]+)?\\b"), # 生成布尔变量,判断是否≥4个单词 has_at_least_4_words = word_count >= 4 ) # 如果需要直接过滤出符合条件的推文,再加一步filter filtered_tweets <- new_tweets_son.df %>% filter(has_at_least_4_words)
代码解释
\\b:匹配单词边界,确保我们统计的是完整单词[[:alpha:]]+(?:['’][[:alpha:]]+)?:匹配由字母组成的单词,同时兼容带撇号的收缩形式或所有格(比如don't、James’)str_count:统计符合规则的单词总数,再通过>=4判断是否满足条件
备选方案:修正正则表达式的str_detect写法
如果你坚持想用正则匹配的方式,也可以调整正则逻辑,确保能识别至少4个单词的文本:
new_tweets_son.df <- tweets_son.df %>% mutate( has_at_least_4_words = str_detect(mysontweets, "^(?:\\W*\\w+){4,}\\W*$") )
正则解释
^和$:匹配文本的开头和结尾,确保整个文本都被检查(?:\\W*\\w+):非捕获组,匹配0个或多个非单词字符(空格、标点)+ 一个单词{4,}:要求这个组至少重复4次,也就是至少有4个单词\\W*:匹配文本结尾可能存在的非单词字符(比如末尾的标点或空格)
内容的提问来源于stack exchange,提问作者Laura Ataraxia
相关产品推荐
相关产品推荐

