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

如何在R中为每只个体按天抽取昼夜占比50/50的随机点位?

R代码实现方案

1. 可复现随机结果设置

你猜测的set.seed()用法是正确的,只需要在所有抽样代码运行前执行一次即可,括号内可以填写任意固定整数,所有运行代码的人使用相同的种子数值,就能得到完全一致的抽样结果。

2. 满足昼夜50%比例的抽样逻辑

核心思路为先给每个个体的所有观测日期随机分配采样时段(一半分配为抽白天、一半分配为抽夜间),再按分配的时段抽取每日1个对应时段的点位,既保留所有日期的点位,又满足昼夜比例要求,完整代码如下:

# 加载依赖包
library(dplyr)

# 固定随机种子,括号内数字可自行修改,固定即可复现结果
set.seed(1234)

# 步骤1:为每个个体的所有观测日期分配采样时段
date_assign <- data %>%
  distinct(animals_id, utc) %>%
  group_by(animals_id) %>%
  mutate(
    total_days = n(),
    # 随机分配一半日期抽白天,剩余抽夜间
    target_day_night = sample(
      c(rep("day", floor(total_days/2)), rep("night", total_days - floor(total_days/2))),
      size = n()
    )
  ) %>%
  ungroup() %>%
  select(-total_days)

# 步骤2:按分配的时段抽取每日1个点位
final_result <- data %>%
  inner_join(date_assign, by = c("animals_id", "utc")) %>%
  # 过滤出当天目标时段的点位
  filter(day_night == target_day_night) %>%
  group_by(animals_id, utc) %>%
  # 当日目标时段内随机抽1个点位
  sample_n(1) %>%
  ungroup() %>%
  select(-target_day_night)

注意事项

  • 如果某只个体某一天的目标时段没有点位数据,代码会报错,可提前做数据校验,给该天重新分配另一时段的采样要求,或者提前剔除没有昼夜双时段数据的日期。
  • 如果总天数为奇数,上述代码会让夜间点位比白天多1个,如果你希望白天多1个,把rep("day", floor(total_days/2))修改为rep("day", ceiling(total_days/2))即可。

内容的提问来源于stack exchange,提问作者Saskia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:54:03