在R中筛选各视频集前20个视频的所有鱼类计数观测数据
使用dplyr筛选每个视频集的前N个唯一视频的所有观测数据
需求说明
- 按
Video_Set分组,保留每个组内**前N个唯一视频(Video_Unique)**的所有观测行(每个视频可能对应多行数据) - 若组内唯一视频数量少于N,直接保留该组全部数据
解决方案代码
library(dplyr) # 模拟数据集 data <- data.frame(Site= c('A', 'A', 'A', 'A', 'A', 'A','B', 'C', 'C', 'C', 'C', 'C'), Video_Set=c(1,1,1,1,1,1,2,3,3,3,3, 3), Video_Unique=c(1,2,3,3,3,3,4,5,6,6,7,8), Fish_Present=c('Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes','No', 'Yes', 'Yes', 'Yes', 'Yes','No')) # 设置要保留的前N个唯一视频(实际使用时替换为20) n <- 2 # 核心筛选逻辑 result <- data %>% group_by(Video_Set) %>% # 筛选当前组内属于前n个唯一视频的所有行 filter(Video_Unique %in% unique(Video_Unique)[1:min(n, n_distinct(Video_Unique))]) %>% ungroup() # 输出结果 print(result)
代码解释
- 分组处理:
group_by(Video_Set)确保每个视频集单独处理 - 提取前N个唯一视频:
unique(Video_Unique)获取当前组内所有唯一的视频ID,顺序为数据中首次出现的顺序min(n, n_distinct(Video_Unique))自动适配视频数量不足N的情况(比如示例中Video_Set2仅1个视频,直接取全部)
- 筛选目标行:
Video_Unique %in% ...保留目标视频的所有关联行,不管每个视频对应多少行数据
结果验证
运行代码后得到的结果与预期的goal完全一致:
# A tibble: 5 × 4 Site Video_Set Video_Unique Fish_Present <chr> <dbl> <dbl> <chr> 1 A 1 1 Yes 2 A 1 2 Yes 3 B 2 4 No 4 C 3 5 Yes 5 C 3 6 Yes
原尝试代码的问题
你之前的代码仅筛选出了组内唯一视频数量大于2的组,但没有进一步筛选组内的前N个视频,因此无法满足保留指定视频所有行的需求。
内容的提问来源于stack exchange,提问作者klpage3816
相关产品推荐
相关产品推荐

