【问题标题】:Selecting a specific range of days prior to event in R在 R 中选择事件前的特定天数
【发布时间】:2018-03-12 18:44:34
【问题描述】:

我已经学习 r 几天了,我正在尝试做一个特定的输出,但我不知道如何在事件之前选择几天。

我正在尝试确定补给事件如何影响水样中的容器检测。我的数据有 7 列(日期、月、日、年、samp、prcip、雪),其中日期为 YYYY/MM/DD,月、日和年是他们所说的,samp 有 0、1、或 NA,并且 precip 和 snow 都有雨或雪的每日总数。每天有 1 行。

我想在采样事件之前探索不同天数的降雨事件。我想选择具有 0(样本且未检测)或 1(具有检测的样本)的行,然后选择前几天,例如本例中的 5,并比较那些先验的平均值、总和等0 和 1 组之间的天数。

我找到了只选择行的方法,并计算连续多少天有 0 或 1 (How to subset consecutive rows if they meet a condition),但我不知道如何选择前几天到采样事件并创建一个新表。

我有超过 20 年的 800 多个采样日,所以我也不想输入每个日期 (Subset dataframe where date is within x days of a vector of dates in R)。

我尝试过使用 %>% 管道和其他一些选择方法,并且已经能够选择包含 0 或 1 的行,但我不明白如何也获得采样日前的天数。我正在寻找任何方向、建议或功能/工具/包来查找,因为我缺乏新的探索途径。

我想选择我的数据,以便最终可以对其进行一些简单的统计。这对我来说是一个探索性项目——学习 r 和练习统计。我想运行 t 检验和方差分析,查看采样前的不同日期。我正在选择采样日,因此我最终可以提出一个问题,例如“采样事件前 5 天的降雨如何影响检测”或“阳性检测前 5 天的降雨平均值与阴性检测前 5 天有何不同”检测”。希望给你我的目的背景可以帮助我解释自己和我在寻找什么。

我的数据现在的样子:

date    month   day year    samp    precip  snow

11/11/1988 11 11 1988 NA 0 0 11/12/1988 11 12 1988 NA 0 0 11/13/1988 11 13 1988 NA 0.55 0 11/14/1988 11 14 1988 NA 0 0 11/15/1988 11 15 1988 NA 0 0 11/16/1988 11 16 1988 NA 0.52 0 11/17/1988 11 17 1988 NA 0 0 11/18/1988 11 18 1988 NA 0 0 11/19/1988 11 19 1988 NA 0 0 11/20/1988 11 20 1988 NA 0.39 0 11/21/1988 11 21 1988 NA 0.43 0 11/22/1988 11 22 1988 NA 0 0 11/23/1988 11 23 1988 NA 0 0 11/24/1988 11 24 1988 NA 0 0 11/25/1988 11 25 1988 NA 0 0 11/26/1988 11 26 1988 NA 0.11 0 11/27/1988 11 27 1988 NA 0.08 0 11/28/1988 11 28 1988 NA 0.01 0 11/29/1988 11 29 1988 NA 0 0 11/30/1988 11 30 1988 NA 0 0 12/1/1988 12 1 1988 NA 0 0 12/2/1988 12 2 1988 NA 0 0 12/3/1988 12 3 1988 NA 0 0 12/4/1988 12 4 1988 NA 0 0 12/5/1988 12 5 1988 NA 0 0 12/6/1988 12 6 1988 NA 0 0 12/7/1988 12 7 1988 NA 0 0 12/8/1988 12 8 1988 NA 0 0 12/9/1988 12 9 1988 NA 0 0 12/10/1988 12 10 1988 NA 0 0 12/11/1988 12 11 1988 NA 0 0 12/12/1988 12 12 1988 NA 0 0 12/13/1988 12 13 1988 NA 0.03 1 12/14/1988 12 14 1988 NA 0 0 12/15/1988 12 15 1988 NA 0 0 12/16/1988 12 16 1988 NA 0 0 12/17/1988 12 17 1988 NA 0 2 12/18/1988 12 18 1988 NA 0 0 12/19/1988 12 19 1988 NA 0 0 12/20/1988 12 20 1988 NA 0.07 0 12/21/1988 12 21 1988 NA 0.02 0 12/22/1988 12 22 1988 NA 0 0 12/23/1988 12 23 1988 NA 1.3 0 12/24/1988 12 24 1988 NA 0 0 12/25/1988 12 25 1988 NA 0 0 12/26/1988 12 26 1988 NA 0 0 12/27/1988 12 27 1988 NA 0.85 3 12/28/1988 12 28 1988 NA 0.37 3 12/29/1988 12 29 1988 NA 0 0 12/30/1988 12 30 1988 NA 0 0 12/31/1988 12 31 1988 NA 0 0 1/1/1989 1 1 1989 NA 0 0 1/2/1989 1 2 1989 NA 0 0 1/3/1989 1 3 1989 NA 0 0 1/4/1989 1 4 1989 NA 0 0 1/5/1989 1 5 1989 NA 0 0 1/6/1989 1 6 1989 NA 0.54 0 1/7/1989 1 7 1989 NA 0 0 1/8/1989 1 8 1989 NA 0.08 0 1/9/1989 1 9 1989 NA 0 0 1/10/1989 1 10 1989 NA 0 0 1/11/1989 1 11 1989 NA 0 0 1/12/1989 1 12 1989 NA 0 0 1/13/1989 1 13 1989 NA 0 0 1/14/1989 1 14 1989 NA 0 0 1/15/1989 1 15 1989 NA 0.04 1 1/16/1989 1 16 1989 NA 0 0 1/17/1989 1 17 1989 NA 0 0 1/18/1989 1 18 1989 NA 0 0 1/19/1989 1 19 1989 NA 0 0 1/20/1989 1 20 1989 NA 0 0 1/21/1989 1 21 1989 NA 0 0 1/22/1989 1 22 1989 NA 0 0 1/23/1989 1 23 1989 NA 0 0 1/24/1989 1 24 1989 NA 0 0 1/25/1989 1 25 1989 NA 0 0 1/26/1989 1 26 1989 NA 0.15 0 1/27/1989 1 27 1989 NA 0 0 1/28/1989 1 28 1989 NA 0 0 1/29/1989 1 29 1989 NA 0 0 1/30/1989 1 30 1989 NA 0 0 1/31/1989 1 31 1989 NA 0 0 2/1/1989 2 1 1989 NA 0 0 2/2/1989 2 2 1989 NA 0 0 2/3/1989 2 3 1989 NA 0.01 0 2/4/1989 2 4 1989 NA 0 0 2/5/1989 2 5 1989 NA 0.28 4 2/6/1989 2 6 1989 NA 0.21 3 2/7/1989 2 7 1989 NA 0 0 2/8/1989 2 8 1989 NA 0 0 2/9/1989 2 9 1989 NA 0 0 2/10/1989 2 10 1989 NA 0 0 2/11/1989 2 11 1989 NA 0 0 2/12/1989 2 12 1989 NA 0 0 2/13/1989 2 13 1989 NA 0.26 1 2/14/1989 2 14 1989 NA 0 0 2/15/1989 2 15 1989 NA 0.04 0 2/16/1989 2 16 1989 NA 0.03 1 2/17/1989 2 17 1989 NA 0 0 2/18/1989 2 18 1989 NA 0 0 2/19/1989 2 19 1989 NA 0 0 2/20/1989 2 20 1989 NA 0 0 2/21/1989 2 21 1989 NA 0.21 2 2/22/1989 2 22 1989 NA 0 0 2/23/1989 2 23 1989 NA 0 0 2/24/1989 2 24 1989 NA 0 0 2/25/1989 2 25 1989 NA 0 0 2/26/1989 2 26 1989 NA 0 0 2/27/1989 2 27 1989 NA 0 0 2/28/1989 2 28 1989 NA 0 0 3/1/1989 3 1 1989 1 0 0 3/2/1989 3 2 1989 NA 0 0 3/3/1989 3 3 1989 NA 0 0 3/4/1989 3 4 1989 NA 0 0 3/5/1989 3 5 1989 NA 0.34 0 3/6/1989 3 6 1989 NA 0 0 3/7/1989 3 7 1989 NA 0 0 3/8/1989 3 8 1989 NA 0 0 3/9/1989 3 9 1989 NA 0 0 3/10/1989 3 10 1989 NA 0 0 3/11/1989 3 11 1989 NA 0 0 3/12/1989 3 12 1989 NA 0 0 3/13/1989 3 13 1989 NA 0 0 3/14/1989 3 14 1989 NA 0 0 3/15/1989 3 15 1989 NA 0 0 3/16/1989 3 16 1989 NA 0 0 3/17/1989 3 17 1989 NA 0 0 3/18/1989 3 18 1989 NA 0.02 0 3/19/1989 3 19 1989 NA 0 0 3/20/1989 3 20 1989 NA 0 0 3/21/1989 3 21 1989 NA 0 0 3/22/1989 3 22 1989 NA 0 0 3/23/1989 3 23 1989 NA 0 0 3/24/1989 3 24 1989 NA 0 0 3/25/1989 3 25 1989 NA 0 0 3/26/1989 3 26 1989 NA 0 0 3/27/1989 3 27 1989 NA 0 0 3/28/1989 3 28 1989 NA 0.02 0 3/29/1989 3 29 1989 NA 0.81 0 3/30/1989 3 30 1989 NA 0 0 3/31/1989 3 31 1989 NA 0 0 4/1/1989 4 1 1989 NA 0 0 4/2/1989 4 2 1989 NA 0.05 0 4/3/1989 4 3 1989 NA 0.81 0 4/4/1989 4 4 1989 NA 0.49 0 4/5/1989 4 5 1989 NA 0 0 4/6/1989 4 6 1989 NA 0 0 4/7/1989 4 7 1989 NA 0 0 4/8/1989 4 8 1989 NA 0 0 4/9/1989 4 9 1989 NA 0.26 0 4/10/1989 4 10 1989 NA 0 0 4/11/1989 4 11 1989 NA 0 0 4/12/1989 4 12 1989 NA 0 0 4/13/1989 4 13 1989 NA 0 0 4/14/1989 4 14 1989 NA 0 0 4/15/1989 4 15 1989 NA 0 0 4/16/1989 4 16 1989 NA 0 0 4/17/1989 4 17 1989 NA 0.27 0 4/18/1989 4 18 1989 NA 0.04 0 4/19/1989 4 19 1989 NA 0 0 4/20/1989 4 20 1989 NA 0 0 4/21/1989 4 21 1989 NA 0 0 4/22/1989 4 22 1989 NA 0 0 4/23/1989 4 23 1989 NA 0 0 4/24/1989 4 24 1989 NA 0 0 4/25/1989 4 25 1989 NA 0 0 4/26/1989 4 26 1989 NA 0 0 4/27/1989 4 27 1989 NA 0.23 0 4/28/1989 4 28 1989 NA 0.28 0 4/29/1989 4 29 1989 NA 0 0 4/30/1989 4 30 1989 NA 0 0 5/1/1989 5 1 1989 NA 0 0 5/2/1989 5 2 1989 NA 0 0 5/3/1989 5 3 1989 0 0.28 0 5/4/1989 5 4 1989 NA 0 0 5/5/1989 5 5 1989 NA 0.06 0 5/6/1989 5 6 1989 NA 0 0 5/7/1989 5 7 1989 NA 0 0 5/8/1989 5 8 1989 NA 0 0 5/9/1989 5 9 1989 NA 0.42 0 5/10/1989 5 10 1989 NA 0.02 0 5/11/1989 5 11 1989 NA 0 0 5/12/1989 5 12 1989 NA 0 0 5/13/1989 5 13 1989 NA 0 0 5/14/1989 5 14 1989 NA 0 0 5/15/1989 5 15 1989 NA 0 0 5/16/1989 5 16 1989 NA 0 0 5/17/1989 5 17 1989 NA 0 0 5/18/1989 5 18 1989 NA 0 0 5/19/1989 5 19 1989 NA 0.05 0 5/20/1989 5 20 1989 NA 1.17 0 5/21/1989 5 21 1989 NA 0 0 5/22/1989 5 22 1989 NA 0 0 5/23/1989 5 23 1989 NA 0.03 0 5/24/1989 5 24 1989 NA 0 0 5/25/1989 5 25 1989 NA 0.21 0 5/26/1989 5 26 1989 NA 0.37 0 5/27/1989 5 27 1989 NA 0 0 5/28/1989 5 28 1989 NA 0 0 5/29/1989 5 29 1989 NA 0 0 5/30/1989 5 30 1989 NA 1.5 0 5/31/1989 5 31 1989 NA 0.14 0 6/1/1989 6 1 1989 1 0.97 0 6/2/1989 6 2 1989 NA 1.04 0 6/3/1989 6 3 1989 NA 0 0 6/4/1989 6 4 1989 NA 0.25 0 6/5/1989 6 5 1989 NA 0 0 6/6/1989 6 6 1989 NA 0 0 6/7/1989 6 7 1989 NA 0 0 6/8/1989 6 8 1989 NA 0 0 6/9/1989 6 9 1989 NA 0 0 6/10/1989 6 10 1989 NA 0 0 6/11/1989 6 11 1989 NA 0 0 6/12/1989 6 12 1989 NA 0.32 0 6/13/1989 6 13 1989 NA 0.16 0 6/14/1989 6 14 1989 NA 0 0

我希望数据完成后的外观:

date month day year samp precip snow 2/24/1989 2 24 1989 NA 0 0 2/25/1989 2 25 1989 NA 0 0 2/26/1989 2 26 1989 NA 0 0 2/27/1989 2 27 1989 NA 0 0 2/28/1989 2 28 1989 NA 0 0 3/1/1989 3 1 1989 1 0 0 4/28/1989 4 28 1989 NA 0.28 0 4/29/1989 4 29 1989 NA 0 0 4/30/1989 4 30 1989 NA 0 0 5/1/1989 5 1 1989 NA 0 0 5/2/1989 5 2 1989 NA 0 0 5/3/1989 5 3 1989 0 0.28 0 5/27/1989 5 27 1989 NA 0 0 5/28/1989 5 28 1989 NA 0 0 5/29/1989 5 29 1989 NA 0 0 5/30/1989 5 30 1989 NA 1.5 0 5/31/1989 5 31 1989 NA 0.14 0 6/1/1989 6 1 1989 1 0.97 0

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
  • 谢谢,我很想这样做,并尝试这样做,但我无法让桌子工作。我对这一切感到很不自在,但我真的在努力。感谢您的反馈,我将弄清楚如何提供反馈,稍后再提供。我很想看看是否有人有一些快速的方向,所以当我不知所措时暂时放弃了问题中的表格。

标签: r


【解决方案1】:

这是使用which(!is.na())purrr::map 的解决方案。这些是了解更多关于tidyversepurrr 的好资源。

library(tidyverse)

str(dat)
#> Classes 'tbl_df', 'tbl' and 'data.frame':    216 obs. of  7 variables:
#>  $ date  : chr  "11/11/1988" "11/12/1988" "11/13/1988" "11/14/1988" ...
#>  $ month : int  11 11 11 11 11 11 11 11 11 11 ...
#>  $ day   : int  11 12 13 14 15 16 17 18 19 20 ...
#>  $ year  : int  1988 1988 1988 1988 1988 1988 1988 1988 1988 1988 ...
#>  $ samp  : int  NA NA NA NA NA NA NA NA NA NA ...
#>  $ precip: num  0 0 0.55 0 0 0.52 0 0 0 0.39 ...
#>  $ snow  : int  0 0 0 0 0 0 0 0 0 0 ...

# Extra: convert date from character to date format
dat <- dat %>% 
  mutate(date = as.Date(date, "%m/%d/%Y"))

查找samp 不是NA 的行位置

idx <- which(!is.na(dat$samp))
idx
#> [1] 111 174 203

接下来我们遍历这些行索引,然后提取它们之前 5 天的值

idx %>% 
  map(. , function(x) dat[(x-5):(x), ])

#> [[1]]
#> # A tibble: 6 x 7
#>   date       month   day  year  samp precip  snow
#>   <date>     <int> <int> <int> <int>  <dbl> <int>
#> 1 1989-02-24     2    24  1989    NA     0.     0
#> 2 1989-02-25     2    25  1989    NA     0.     0
#> 3 1989-02-26     2    26  1989    NA     0.     0
#> 4 1989-02-27     2    27  1989    NA     0.     0
#> 5 1989-02-28     2    28  1989    NA     0.     0
#> 6 1989-03-01     3     1  1989     1     0.     0
#> 
#> [[2]]
#> # A tibble: 6 x 7
#>   date       month   day  year  samp precip  snow
#>   <date>     <int> <int> <int> <int>  <dbl> <int>
#> 1 1989-04-28     4    28  1989    NA  0.280     0
#> 2 1989-04-29     4    29  1989    NA  0.        0
#> 3 1989-04-30     4    30  1989    NA  0.        0
#> 4 1989-05-01     5     1  1989    NA  0.        0
#> 5 1989-05-02     5     2  1989    NA  0.        0
#> 6 1989-05-03     5     3  1989     0  0.280     0
#> 
#> [[3]]
#> # A tibble: 6 x 7
#>   date       month   day  year  samp precip  snow
#>   <date>     <int> <int> <int> <int>  <dbl> <int>
#> 1 1989-05-27     5    27  1989    NA  0.        0
#> 2 1989-05-28     5    28  1989    NA  0.        0
#> 3 1989-05-29     5    29  1989    NA  0.        0
#> 4 1989-05-30     5    30  1989    NA  1.50      0
#> 5 1989-05-31     5    31  1989    NA  0.140     0
#> 6 1989-06-01     6     1  1989     1  0.970     0

如果我们想要数据框中的结果

idx %>% 
  map_df(. , function(x) dat[(x-5):(x), ])

#> # A tibble: 18 x 7
#>    date       month   day  year  samp precip  snow
#>    <date>     <int> <int> <int> <int>  <dbl> <int>
#>  1 1989-02-24     2    24  1989    NA  0.        0
#>  2 1989-02-25     2    25  1989    NA  0.        0
#>  3 1989-02-26     2    26  1989    NA  0.        0
#>  4 1989-02-27     2    27  1989    NA  0.        0
#>  5 1989-02-28     2    28  1989    NA  0.        0
#>  6 1989-03-01     3     1  1989     1  0.        0
#>  7 1989-04-28     4    28  1989    NA  0.280     0
#>  8 1989-04-29     4    29  1989    NA  0.        0
#>  9 1989-04-30     4    30  1989    NA  0.        0
#> 10 1989-05-01     5     1  1989    NA  0.        0
#> 11 1989-05-02     5     2  1989    NA  0.        0
#> 12 1989-05-03     5     3  1989     0  0.280     0
#> 13 1989-05-27     5    27  1989    NA  0.        0
#> 14 1989-05-28     5    28  1989    NA  0.        0
#> 15 1989-05-29     5    29  1989    NA  0.        0
#> 16 1989-05-30     5    30  1989    NA  1.50      0
#> 17 1989-05-31     5    31  1989    NA  0.140     0
#> 18 1989-06-01     6     1  1989     1  0.970     0

更紧凑的形式,您将 function(x) &amp; x 替换为 "~" &amp; "."

idx %>% 
  map_df(~ dat[(. -5):(.), ])

reprex package (v0.2.0) 于 2018 年 3 月 12 日创建。

【讨论】:

  • 非常感谢!在此处发布问题可能令人生畏,反馈可能是粗鲁和轻视的。您的评论非常有帮助,我将研究您提到的许多事情,这是我进行统计分析的一个很好的起点。抽样日期和相关天数的突破正是我的想法,但没有在 R 中表达。感谢您的时间和对您的解决方案的清晰解释。
  • 不客气!很抱歉你对 SO 有这种感觉。我可以理解其他海报,因为每天有数百个帖子寻求帮助,而无需付出任何努力或提供任何可重复的数据。根据我自己的经验,您需要先做好功课才能充分利用 SO。这里有许多博学多才的人。无论如何,我建议您花大量时间阅读这些内容:R for data scienceR for Earth-System Science。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
相关资源
最近更新 更多