【问题标题】:How to extract one random daytime per day for every individual with a 50/50 ratio of night and day times in R?如何在R中以50/50的夜间和白天时间比率为每个人每天提取一个随机的白天?
【发布时间】:2021-12-01 07:40:33
【问题描述】:

我对 R 没有太多经验,并且遇到以下问题:我有来自无线电项圈野猫的 csv 格式的数据,带有日期时间戳和 GPS 位置(以及一些额外的信息,如性别、年龄等)。我必须平衡每个人的数据集,因为修复(位置)的频率是不相等的。我想每天为每只猫的数据提取一个随机位置。此外,每个人选择的随机点应具有 50/50 的昼夜点比率。为此,我创建了一个列来定义该位置是在夜间还是白天记录,但我不知道如何将比率规则添加到我的代码中。我还想知道是否可以在代码中保存随机选择的点,所以如果其他人再次运行它,他们会得到与我第一次提取相同的随机点(我认为可以使用 set.seed 完成?)。我经常只是不知道如何组合我想使用的所有功能。

我想我每天使用以下代码成功地为每个人提取了一个随机点:

data %>% group_by(animals_id,utc) %>%
  sample_n(1) -> result 

但是我怎样才能包含每个人的 50/50 日夜分数比率以及如何添加 set.seed 函数?

这是我的数据集的结构:

  X animals_id    acquisition_time longitude latitude
1 1          1 2010-05-01 02:59:00  7.604915 47.94362
2 2          1 2010-05-01 10:00:00  7.604967 47.94373
3 3          1 2010-05-01 16:59:00  7.605800 47.94379
4 4          1 2010-05-02 06:59:00  7.604969 47.94358
5 5          1 2010-05-02 13:59:00  7.604921 47.94008
6 6          1 2010-05-03 03:59:00  7.605051 47.94356
       projection collar_type study_area_id animals_age_class
1 EPSG:4326-WGS48         gps            13                 a
2 EPSG:4326-WGS48         gps            13                 a
3 EPSG:4326-WGS48         gps            13                 a
4 EPSG:4326-WGS48         gps            13                 a
5 EPSG:4326-WGS48         gps            13                 a
6 EPSG:4326-WGS48         gps            13                 a
  animals_sex        utc day_night
1           f 2010-05-01     night
2           f 2010-05-01       day
3           f 2010-05-01       day
4           f 2010-05-02       day
5           f 2010-05-02       day
6           f 2010-05-03     night
> 

我非常感谢每一个提示。

【问题讨论】:

  • 我想检查一下我是否理解正确。因此,从您的数据框中,您需要为每个animals_id 列随机选择一对“经度”和“纬度”列(指示位置),但您需要确保在所选样本中,列“day_night”白天和黑夜的数量必须相等。对吗?
  • 每个数据点都有昼夜值吗?
  • @AbdurRohman 不完全是:我想为每个人每天随机选择一对坐标。这些人每天记录不同数量的位置。如果一个人被监测 250 天,它可以记录 1000 个坐标。我想最终得到那个人的 250 对坐标,每天一个。这个子集应该从每个人每天的不同时间戳中“随机”取出。你是对的,我想确保每个人的数据集包含相同数量的昼夜点。
  • @Tjn25 如果您的意思是每个位置的数据点,那么 no 。每个位置都在白天或晚上记录。每个数据点(位置)都是唯一的。但是所有的猫都有白天和黑夜的数据点,它们每天都被监控。

标签: r datetime location subset


【解决方案1】:

我尝试定义一个函数,该函数根据列对数据框中的行进行随机抽样,其中的元素可以分组。该函数根据列的组对数据框进行拆分,然后在每组中随机选择相等数量的行,然后将样本绑定回一个数据框。 n.each 参数指定每组的采样行数。如果未指定,则使用 n.each = 1。 通过指定seed 参数,可以复制随机采样的行集。如果未指定,则使用 seed = 1colname 是列名(应该被引用)。 请注意,从结果样本中删除了行名。

这里是函数和例子

library(data.table)
library(magrittr)

sample_equal <- function(df, colname, n.each = 1, seed = 1) {

  eqsamp <- function(df) {
    set.seed(seed)
    df %>%
      transpose %>%
      sample(n.each) %>%
      transpose
  }

  sampled <- df %>%
    split(df[colname]) %>%
    lapply(eqsamp) %>%
    do.call(rbind, .) 
  
  rownames(sampled) <- NULL
  colnames(sampled) <- colnames(df)
  return(sampled)
}

# Example1 : Applied to `iris`

iris %>% sample_equal('Species', 2, seed = 3)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#1            5         3.6          1.4         0.2     setosa
#2          4.8         3.4          1.6         0.2     setosa
#3          6.5         2.8          4.6         1.5 versicolor
#4          5.9           3          4.2         1.5 versicolor
#5          6.5           3          5.8         2.2  virginica
#6          6.4         2.7          5.3         1.9  virginica

# Example2 : Multistage sampling to `mtcars` 

sample_equal(mtcars, 'cyl', 3, seed = 5) %>% 
sample_equal('gear', 2, seed = 3)

#   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#1 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#2 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#3 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#4 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#5 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#6 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2

要将其应用于您的数据,如果您想选择一天一夜,这应该可以:

result <- data %>% group_by(animals_id,utc) %>% 
equal_sample('day_night', seed = 3) 

结果会有一夜一夜,但样本中的经纬度可能完全相同。

如果您需要独特的位置,您可以按纬度或经度分组,然后进行日/夜采样。您还需要指定在每个纬度或经度中采样的日/夜数。例如:

result2 <- data %>% group_by(animals_id,utc, latitude) %>% 
equal_sample('day_night', seed = 3)

【讨论】:

    猜你喜欢
    • 2016-04-08
    • 2012-04-10
    • 2018-02-15
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多