调用YouTube API获取频道数据时遇行数量不匹配错误的求助
调用YouTube API获取频道数据时遇行数量不匹配错误的求助
看起来你遇到的问题是创建标准化数据框时,部分频道的API返回字段存在空值,导致不同列的行数不一致(比如有的字段有1条数据,有的字段是0条),最终触发了arguments imply differing number of rows: 1, 0错误。我来帮你分析下原因和解决办法:
问题根源
YouTube API返回的频道数据不是所有字段都保证存在的:
- 比如部分频道可能没有设置公开的
country信息,返回的snippet.country就是空值; - 有些频道隐藏了订阅数,
statistics.subscriberCount会返回空,只有hiddenSubscriberCount为TRUE; - 甚至少数情况下,某些统计字段可能因为API返回异常而缺失。
这些空值字段在转化为数据框列时,长度为0,和其他有值的字段(长度为1)冲突,导致报错。
解决办法
1. 给空值字段填充NA,保证列长度一致
修改standardized_df的创建逻辑,对每个字段做空值判断,不存在的话填充NA,确保所有列的长度都是1:
standardized_df <- data.frame( channel_id = ifelse(is.null(channel.df$id), NA, channel.df$id), title = ifelse(is.null(channel.df$snippet.title), NA, channel.df$snippet.title), description = ifelse(is.null(channel.df$snippet.description), NA, channel.df$snippet.description), published_at = ifelse(is.null(channel.df$snippet.publishedAt), NA, channel.df$snippet.publishedAt), country = ifelse(is.null(channel.df$snippet.country), NA, channel.df$snippet.country), view_count = ifelse(is.null(channel.df$statistics.viewCount), NA, as.numeric(channel.df$statistics.viewCount)), subscriber_count = ifelse(is.null(channel.df$statistics.subscriberCount), NA, as.numeric(channel.df$statistics.subscriberCount)), hiddensub_count = ifelse(is.null(channel.df$statistics.hiddenSubscriberCount), NA, channel.df$statistics.hiddenSubscriberCount), video_count = ifelse(is.null(channel.df$statistics.videoCount), NA, as.numeric(channel.df$statistics.videoCount)), stringsAsFactors = FALSE )
另外建议把统计类字段(比如view_count)转成数值型,方便后续的数据分析操作。
2. 优化前置判断逻辑,跳过无效数据
你之前的判断逻辑已经覆盖了items存在且不为空的情况,但可以再加上一层判断,确保channel.df确实有数据:
if ("items" %in% names(channel.json) && length(channel.json$items) > 0) { channel.df <- channel.json$items # 新增判断:确保channel.df有有效数据行 if (nrow(channel.df) > 0) { # 这里放创建standardized_df的代码 channel_data_list[[channel_id]] <- standardized_df } else { print(paste("Warning: No valid data found for channel ID", channel_id)) } } else { print(paste("Warning: No items returned for channel ID", channel_id)) }
这样可以跳过那些API返回了items但内容为空的异常情况,避免后续代码出错。
测试建议
你可以在创建standardized_df之前,先打印出当前channel.df的所有字段,看看哪些字段是空的:
print(paste("Checking fields for channel ID", channel_id)) str(channel.df)
这样能更直观地定位到是哪个字段导致的行数不匹配问题。
备注:内容来源于stack exchange,提问作者Just_an_avg_human
相关产品推荐
相关产品推荐

