如何按多列分组计算分类变量唯一值及物种白天检测占比
相机陷阱数据处理方案
问题说明
处理包含camera(相机名称)、species(物种)、time_cat(检测时段:day/night)的相机陷阱数据,需完成:
- 按
camera+species分组,计算每组总检测次数total.detections,以及白天检测占比perc.day(公式:白天检测数/该组总检测数) - 掌握多列分组下分类变量唯一值的统计方法
数据示例
camera <- c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C') species <- c('deer', 'deer', 'deer', 'coyote', 'deer', 'deer', 'deer', 'deer', 'coyote', 'coyote', 'coyote', 'bobcat') time_cat <- c('day', 'day', 'night', 'day', 'night', 'day', 'day', 'day', 'night', 'day', 'night', 'night') data <- data.frame(camera, species, time_cat)
期望输出
camera <- c('A', 'A', 'B', 'C', 'C', 'C') species <- c('deer', 'coyote', 'deer', 'deer', 'coyote', 'bobcat') total.detections <- c('3', '1', '3', '1', '3', '1') perc.day <- c('0.667', '0', '0.667', '100', '0.333', '0') data.final <- data.frame(camera, species, total.detections, perc.day)
现有代码
已实现total.detections计算,但缺少perc.day:
data.final <- data %>% group_by(camera, species) %>% summarize(total.detections = n())
解决方案
1. dplyr方法计算perc.day
在分组汇总时,直接统计白天检测次数,再计算占比并格式化:
library(dplyr) data.final <- data %>% group_by(camera, species) %>% summarize( total.detections = n(), perc.day = round(sum(time_cat == 'day') / n(), 3) ) %>% # 处理100%的显示格式 mutate(perc.day = ifelse(perc.day == 1, 100, perc.day)) %>% # 若需转为字符串类型,添加以下行 # mutate(across(c(total.detections, perc.day), as.character)) %>% ungroup()
2. data.table方法实现
用data.table的链式操作完成计算:
library(data.table) setDT(data) data.final <- data[, .( total.detections = .N, perc.day = round(sum(time_cat == 'day') / .N, 3) ), by = .(camera, species)][, perc.day := fifelse(perc.day == 1, 100, perc.day) ] # 如需转字符串:data.final[, c('total.detections', 'perc.day') := lapply(.SD, as.character), .SDcols = c('total.detections', 'perc.day')]
3. 多列分组统计分类变量唯一值
dplyr方式
使用n_distinct()函数统计唯一值数量:
# 按camera分组,统计每个相机的唯一物种数 data %>% group_by(camera) %>% summarize(unique_species = n_distinct(species)) # 按camera+species分组,统计每组的唯一时段数 data %>% group_by(camera, species) %>% summarize(unique_time = n_distinct(time_cat))
data.table方式
使用uniqueN()函数:
# 按camera分组统计唯一物种数 data[, .(unique_species = uniqueN(species)), by = camera] # 按camera+species分组统计唯一时段数 data[, .(unique_time = uniqueN(time_cat)), by = .(camera, species)]
内容的提问来源于stack exchange,提问作者SundrenchedRain
相关产品推荐
相关产品推荐

