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

R语言如何删除数据框列中含@的提及内容并拆分原帖、回复字段

实现逻辑

核心通过正则匹配完成两类推文的拆分处理,200万行数据量下可秒级跑完:

  • 判断推文是否为回复类内容
  • 对回复类内容提取剔除@用户名后的正文,对原创内容直接保留原文

R语言实现

普通dplyr版本(易读性高)

library(dplyr)
library(stringr)

# 正则规则:匹配开头所有连续的@+推特合法用户名+空格组合,支持同时@多个账号的场景
reply_pattern <- "^(?:@[A-Za-z0-9_]{1,15}\\s+)*"

df <- df %>%
  mutate(
    is_reply = str_detect(Tweet, "^@[A-Za-z0-9_]"),
    Original_Tweet = ifelse(is_reply, NA_character_, Tweet),
    Reply_Tweet = ifelse(is_reply, str_remove(Tweet, reply_pattern), "")
  ) %>%
  select(-is_reply)

data.table版本(性能最优,适合大数据量)

library(data.table)
setDT(df)

reply_pattern <- "^(?:@[A-Za-z0-9_]{1,15}\\s+)*"
df[, `:=`(
  Original_Tweet = fifelse(grepl("^@[A-Za-z0-9_]", Tweet), NA_character_, Tweet),
  Reply_Tweet = fifelse(grepl("^@[A-Za-z0-9_]", Tweet), sub(reply_pattern, "", Tweet), "")
)]

Python实现(pandas版本)

import pandas as pd
import re

reply_pattern = r"^(?:@[A-Za-z0-9_]{1,15}\s+)*"

df["is_reply"] = df["Tweet"].str.match(r"^@[A-Za-z0-9_]")
df["Original_Tweet"] = df["Tweet"].where(~df["is_reply"], pd.NA)
df["Reply_Tweet"] = df["Tweet"].str.replace(reply_pattern, "", regex=True).where(df["is_reply"], "")
df = df.drop("is_reply", axis=1)

自定义调整说明

  • 如果你的规则中「只要包含任意位置的@就算回复」,可以把判断逻辑里的开头匹配符^删除即可,R端把str_detect(Tweet, "^@[A-Za-z0-9_]")改为str_detect(Tweet, "@[A-Za-z0-9_]"),Python端把str.match(r"^@[A-Za-z0-9_]")改为str.contains(r"@[A-Za-z0-9_]")
  • 如果不需要处理同时@多个账号的场景,把正则中的*改为{1}即可,只会删除第一个@用户名

内容的提问来源于stack exchange,提问作者Dinho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:48:00