You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按多列分组计算分类变量唯一值及物种白天检测占比

相机陷阱数据处理方案

问题说明

处理包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:54:36