You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mutate函数创建新变量筛选含至少4个单词的推文遇阻

解决方法:筛选单词数≥4的推文

我来帮你搞定这个问题!你的代码主要有两个小问题:管道操作的语法错误,以及正则表达式的逻辑不够准确。下面一步步给你修正和优化:

先分析原代码的问题

  1. 管道语法错误:用%>%传递数据框后,mutate里不需要再写tweets_son.df = ...,直接定义新变量名即可,比如has_enough_words = ...。
  2. 正则表达式逻辑偏差:你写的正则试图匹配“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:05:22