使用R(或易用工具)重构视频序列观测数据的技术问询
高效处理R中视频观测序列的合并与去重
先模拟符合你场景的示例数据
假设你的数据包含video_id(视频唯一标识)、sequence_num(序列的顺序编号)、score(评分,含重复),先模拟一份同结构的数据方便演示:
set.seed(123) df <- data.frame( video_id = rep(1:700, sample(2:4, 700, replace = TRUE)), sequence_num = unlist(lapply(sample(2:4, 700, replace = TRUE), function(x) 1:x)), score = rnorm(700*3, mean=5, sd=1), stringsAsFactors = FALSE ) # 加入10%重复行模拟你的重复评分场景 dup_rows <- sample(nrow(df), round(nrow(df)*0.1)) df <- rbind(df, df[dup_rows, ])
1. 处理重复评分
根据你的重复数据类型选对应方案:
方案A:去除完全重复的行
如果重复的序列数据完全一致,直接去重:
df_unique <- unique(df)
方案B:对同一序列的重复评分取均值
如果重复是同一序列的两次不同评分,取均值保留唯一值:
library(dplyr) df_unique <- df %>% group_by(video_id, sequence_num) %>% summarise(score = mean(score), .groups = "drop")
2. 将同一视频的序列合并为单行
推荐:用tidyverse的pivot_wider(代码直观易读)
先确保已安装tidyr包,用它把长格式数据转成宽格式,自动按序列顺序排列:
library(tidyr) df_combined <- df_unique %>% pivot_wider( id_cols = video_id, names_from = sequence_num, names_prefix = "sequence_", values_from = score )
处理后每个video_id对应一行,sequence_1、sequence_2...分别对应该视频的第1、2...个序列评分,顺序由sequence_num严格保证。
基础R实现(无需额外包)
如果不想装包,用基础R的reshape函数:
# 先按视频ID和序列编号排序,保证合并顺序正确 df_unique_sorted <- df_unique[order(df_unique$video_id, df_unique$sequence_num), ] # 转换为宽格式 df_combined <- reshape( df_unique_sorted, idvar = "video_id", timevar = "sequence_num", direction = "wide", sep = "_" )
3. 验证结果
可以简单检查合并是否符合预期:
# 确认合并后是700条视频记录 nrow(df_combined) == 700 # 查看某条视频的合并结果 df_combined[df_combined$video_id == 1, ]
内容的提问来源于stack exchange,提问作者Øyvind
相关产品推荐
相关产品推荐

