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
相关产品推荐
相关产品推荐

