如何在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
相关产品推荐
相关产品推荐

