rtweet包search_tweets()函数未返回全部预期列的解决方法
问题原因
rtweet 1.0及以上版本默认调用X(原Twitter)API v2端点采集数据,默认请求的字段范围不包含发推作者信息、提及用户详情等扩展内容,同时默认解析规则不会将嵌套的关联字段自动展开为独立列,因此仅返回35列基础推文字段,缺失screen_name、mentions_screen_name等常用分析字段。
解决方法
方法1:启用旧版返回兼容模式(最简便,适配绝大多数分析场景)
调用search_tweets()时添加use_rv1 = TRUE参数即可,rtweet会自动按照0.7.x旧版本的逻辑请求全量常用字段,将所有嵌套数据拍平为扁平数据框,返回结构和旧版rtweet完全一致,直接包含你需要的所有常用列:
# 采集时传入兼容参数 tweets.df <- search_tweets("science", use_rv1 = TRUE) # 校验列名,此时可找到screen_name、mentions_screen_name等目标列 names(tweets.df)
该方法不需要额外处理嵌套结构,代码改造成本最低,如果你不需要用到v2端点的特殊能力,优先选这个方案。
方法2:自定义v2端点请求字段(适合需要精准控制返回内容的场景)
如果你需要使用v2端点的自定义查询能力,可以手动指定要请求的扩展范围、字段类型,拿到数据后自行关联提取目标列:
- 调用接口时传入扩展参数,明确告诉API需要返回的关联数据:
tweets.df <- search_tweets( "science", # 指定拉取的关联对象:作者信息、提及用户、回复对象 expansions = c("author_id", "entities.mentions.username", "in_reply_to_user_id"), # 指定返回的用户字段:用户名(对应旧版screen_name)、昵称、主页等 user.fields = c("username", "name", "location") )
- 提取发推用户的
screen_name:返回结果会附带独立的用户信息表,直接匹配关联即可
# 提取结果附属的用户信息表 user_tbl <- attributes(tweets.df)$users # 按用户id匹配,给推文表添加screen_name列 tweets.df$screen_name <- user_tbl$username[match(tweets.df$author_id, user_tbl$user_id)]
- 提取
mentions_screen_name:该字段存储在嵌套的entities列中,可通过tidyr的unnest函数展开聚合:
library(dplyr) library(tidyr) # 展开entities中存储的提及用户信息 mention_tbl <- tweets.df %>% select(id, entities) %>% unnest(entities = entities$mentions, names_sep = "_") %>% # 按推文id聚合单条推文提到的所有用户名 group_by(id) %>% summarise(mentions_screen_name = list(entities_username)) # 将提及用户列合并回原推文表 tweets.df <- left_join(tweets.df, mention_tbl, by = "id")
注意事项
- 非必要不要设置
parse = FALSE,该参数会返回未做任何解析的原生嵌套JSON列表,后续处理成本极高 - 如果使用rtweet 1.0以下版本出现同类字段缺失问题,直接重新安装最新版rtweet即可,一般是安装过程中文件损坏导致的解析异常
内容的提问来源于stack exchange,提问作者luciano Mattar
相关产品推荐
相关产品推荐

