在R中筛选两类数据行:跨年度存在的动物及周观测数超2的动物
这里给你针对两个筛选需求的R语言实现方案,用tidyverse的dplyr包来处理会很直观,先把原始数据集构造出来:
# 构造原始数据集 df <- data.frame( Animal = c("A", "B", "B", "A", "B", "A", "B", "C", "B", "A"), Year = c(2018, 2017, 2019, 2018, 2019, 2019, 2017, 2019, 2018, 2019), Week = c(15, 15, 16, 17, 15, 16, 15, 17, 18, 15), Value = c(14, 6, 9, 17, 25, 27, 20, 6, 3, 5) )
需求1:保留同时出现在2018和2019年的动物行
思路
先确定哪些动物在2018和2019年都有记录,再筛选这些动物的所有行——动物C仅在2019年有数据,会被完全排除。
实现代码
library(dplyr) df_filtered1 <- df %>% group_by(Animal) %>% # 筛选同时存在2018、2019年记录的动物 filter(any(Year == 2018) & any(Year == 2019)) %>% ungroup() # 查看结果 df_filtered1
输出结果
# A tibble: 9 × 4 Animal Year Week Value <chr> <dbl> <dbl> <dbl> 1 A 2018 15 14 2 B 2017 15 6 3 B 2019 16 9 4 A 2018 17 17 5 B 2019 15 25 6 A 2019 16 27 7 B 2017 15 20 8 B 2018 18 3 9 A 2019 15 5
需求2:保留每周观测数超过2的动物对应的行
思路
先按「动物+周」的组合分组,统计每组的观测行数,再筛选出行数超过2的组合对应的所有行——只有动物B的第15周有3条记录,所以最终只保留这3行。
实现代码
df_filtered2 <- df %>% group_by(Animal, Week) %>% # 新增临时列统计每组行数 mutate(row_count = n()) %>% # 筛选行数>2的组 filter(row_count > 2) %>% # 移除临时统计列 select(-row_count) %>% ungroup() # 查看结果 df_filtered2
输出结果
# A tibble: 3 × 4 Animal Year Week Value <chr> <dbl> <dbl> <dbl> 1 B 2017 15 6 2 B 2019 15 25 3 B 2017 15 20
内容的提问来源于stack exchange,提问作者Baffo
相关产品推荐
相关产品推荐

