如何用videodata.csv筛选多参与者id_data.csv数据并按影片分类存储?
R实现:基于videodata分割并聚合参与者score数据到对应影片文件
步骤1:读取并整理videodata
首先读取videodata.csv,将每个参与者对应影片的start/end行号转换为宽格式,便于后续提取数据:
library(tidyverse) # 读取videodata文件 videodata <- read.csv("videodata.csv", stringsAsFactors = FALSE) # 转换为宽格式,得到每个参与者-影片的起止区间 video_ranges <- videodata %>% pivot_wider( id_cols = c(Event.Type, Source), names_from = Name, values_from = Row ) %>% rename(movie = Event.Type, participant = Source, start_row = start, end_row = end)
步骤2:批量读取所有参与者的id_data文件
假设所有参与者的id_data.csv文件存放在./participant_data/目录下,文件名格式为{participant}_data.csv(如012_data.csv),批量读取并存储到列表中:
# 获取所有参与者数据文件路径 data_files <- list.files(path = "./participant_data/", pattern = "*_data.csv", full.names = TRUE) # 批量读取文件,列表元素命名为参与者ID participant_data <- map(data_files, read.csv, stringsAsFactors = FALSE) %>% set_names(str_extract(data_files, "\\d{3}")) # 提取文件名中的3位参与者ID
步骤3:按影片聚合数据并保存为独立文件
遍历每个影片,提取对应所有参与者的指定区间score数据,用NA填充对齐不同长度的序列后,保存为以影片命名的csv文件:
# 获取所有唯一影片名称 unique_movies <- unique(video_ranges$movie) # 遍历处理每个影片 walk(unique_movies, function(current_movie) { # 获取当前影片对应的参与者区间信息 movie_participants <- video_ranges %>% filter(movie == current_movie) # 提取每个参与者的对应score数据 movie_data <- map_dfc(movie_participants$participant, function(pid) { # 获取当前参与者的起止行号 range_info <- movie_participants %>% filter(participant == pid) start <- range_info$start_row end <- range_info$end_row # 提取score序列,用NA填充对齐最长长度 scores <- participant_data[[pid]]$score[start:end] tibble(!!pid := scores) }) # 保存为csv文件,文件名统一小写(如movie1.csv) write.csv(movie_data, str_to_lower(paste0(current_movie, ".csv")), row.names = FALSE) })
补充说明
- 代码依赖
tidyverse包,运行前需确保已安装:install.packages("tidyverse") - 若参与者数据文件命名规则不同,需调整
str_extract中的正则表达式以正确提取参与者ID - 不同长度的score序列会自动用NA填充对齐,保证列结构统一
内容的提问来源于stack exchange,提问作者socialresearcher
相关产品推荐
相关产品推荐

