Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何为每个分组元素选择随机的非连续日期?_R_Random_Dplyr - Fatal编程技术网

R 如何为每个分组元素选择随机的非连续日期?

R 如何为每个分组元素选择随机的非连续日期?,r,random,dplyr,R,Random,Dplyr,我目前正在尝试为每个分组列选择非连续日期 换句话说,我有以下数据帧: 我想基本上按(站点)分组,然后为每个分组站点只保留3个随机的非连续日期。例如,如果HP37P1B的日期对应于3月12日、3月13日、3月14日和3月7日,则我需要一个数据帧(例如),该数据帧只有: HP37P1B 3月12日 HP37P1B 3月14日 HP37P1B 3月7日 到目前为止,我已经尝试了许多使用diff()、ave()和lubridate包的stackoverflow帖子,但我没有取得任何成功 编辑 基于下面

我目前正在尝试为每个分组列选择非连续日期

换句话说,我有以下数据帧:

我想基本上
按(站点)分组,然后为每个分组站点只保留3个随机的非连续日期。例如,如果HP37P1B的日期对应于3月12日、3月13日、3月14日和3月7日,则我需要一个数据帧(例如),该数据帧只有:

HP37P1B 3月12日

HP37P1B 3月14日

HP37P1B 3月7日

到目前为止,我已经尝试了许多使用
diff()
ave()
lubridate
包的stackoverflow帖子,但我没有取得任何成功

编辑

基于下面的评论,我试图让这个问题重现

dput(uniqueSiteDate)


为了回答其他问题,有时每个站点有3个以上的日期,但有时每个站点只有1个日期。但这个想法是在给定的站点上选择n个非连续日期。换句话说,如果一个特定站点有4个日期,我需要3个非连续的日期。如果一个特定的站点只有一个日期,我们就把它留在这里。

这应该可以,但我不能在您的数据上真正测试它,因为每个站点只包含一行(因此只有一个日期)


l%分组单位(现场)%>%
组映射(函数(x,y){
n、 day.increments=2 | |(n.day.increments>=2和&n.2day.increments>=1)
can.have.2.dates=2 | | n.2day.increments>=1
重复{
如果(可以有日期){
d%样品(3)
如果(全部(abs(差异(d$日期))>1))
打破
}else if(can.have.2.dates){
如果(可以有日期){
d%样品(2)
如果(全部(abs(差异(d$日期))>1))
打破
}
}否则{
d%样本(1)
打破
}
}
cbind(y,d)
})

采样数据请检查它是否达到目的?事实上,用提供标准选择可能的最大日期是困难的(至少对我来说)。我们可以通过以下策略确定连续和非连续组中的日期。但是从两组连续3次约会中考虑两种情况。如果随机样本包含2个单位,则这些单位可以是连续的,也可以是非连续的。假设我们进一步选择奇数(2)行或偶数(1)行,那么我认为样本是判断性的,而不是随机的。这就是所采取的战略-

  • 将数据分组
  • 通过最后一行绑定数据的
    purrr::map_df
    分别在各组中执行操作
  • 将数据(现在为组)分为连续日期和非连续日期(每个连续日期将在其自己的组中)。从每个组中选择唯一的行
  • 最后,从每一行中选择三个(或更少,根据组结果)
库(tidyverse)
df%>%
解组()%>%
分组(站点)%>%
map_df(,~.x%>%ungroup()%>%
安排(日期)%>%
突变(n=1)%>%
完成日期(日期=顺序日期(第一个(日期)、最后一个(日期)、截止日期='days'))%>%
分组依据(n=cumsum(is.na(n)))%>%
过滤器(!is.na(站点))%>%
样本n(1)%>%
解组()%>%
样本n(最小(n(),3)))%>%
选择(-n)
#A tibble:86 x 2
日期站点
1 2020-03-04 HP36P1B
2 2020-03-04 HP36P3B
3 2020-03-04 HP36P4B
4 2020-03-07 HP37P1B
5 2020-03-12 HP37P1B
6 2020-03-07 HP37P2B
7 2020-03-12 HP37P2B
8 2020-03-07 HP37P4B
9 2020-03-12 HP37P4B
10 2020-03-04 HP4008R
# ... 还有76行

注意:您的dput已分组,所以我必须在代码的第二行添加
ungroup()
,您可以删除它。你能举个例子吗?2.
站点是否总是至少有3个日期?3.“非连续”部分是硬要求吗?或者随机抽取3个日期(因此可能连续)的解决方案是否令人满意?如果没有,是否保证不仅有3个日期,而且有3个日期可以找到解决方案?即使您的图片与所述示例不匹配??第一个
site
中的日期对于所有三行都是相同的。我添加了更多信息来帮助回答这个问题@Aurèle@AnoushiravanR请参阅上面提供的数据中的编辑,第一组的所有日期都相同?立即获取错误。你能看到对问题的编辑吗?当然,看到更新的代码即使只有一个日期与网站相关,这也应该有效,对吧?不,绝对不是,你更新的问题说还有两个非连续日期是可以的,所以这是我新的最低要求。我已经对问题进行了进一步编辑-请参阅。非常感谢@AnilGoyal。但是,以HP37P1B为例,可以选择3个非连续日期,但只选择了两个。例如,我们可以选择3月7日(你选择了),3月12日(你选择了),但也可以选择3月14日。其他一些网站也是如此。是的,确实如此,但样本不会是随机的。这是唯一可能的样本,不,我的意思是-我想选择至少3个随机的非连续样本。在您的代码中,我们仅选择了2个。对于HP37P1B,至少可以选择3个非连续的日期,而对于HP36P1B,只能选择1个日期。?这有意义吗基本上,如果我要求你选择任意数量的非连续日期(随机),给定样本量。
structure(list(Site = c("HP37P1B", "HP37P2B", "HP37P4B", "HP4008U", 
"INME03R", "INME03U", "INOA03R", "IPTO04R", "IPTO04U", "IPTO06R", 
"IPTO06U", "OLCAP2B", "OLCAP3B", "OLCAP5B", "PANMP1B", "PANMP2B", 
"PANMP3B", "STIN02R", "STIN02U", "UPMAP1B", "UPMAP3B", "UPMAP4B", 
"UPMAP5B", "UPMAP6B", "VAR210R", "VAR310R", "VAR310U", "VAR410R", 
"VAR410U", "HP36P1B", "HP36P3B", "HP36P4B", "HP4008R", "INBS04R", 
"INBS04U", "SEL107R", "SEL107U", "SEL207R", "SEL207U", "OLV110R", 
"OLV110U", "OLV208R", "OLV208U", "THEN10U", "HP37P1B", "HP37P2B", 
"HP37P4B", "HP4008U", "INME03R", "INME03U", "INOA03R", "IPTO04R", 
"IPTO04U", "IPTO06R", "IPTO06U", "OLCAP2B", "OLCAP3B", "OLCAP5B", 
"PANMP1B", "PANMP2B", "PANMP3B", "STIN02R", "STIN02U", "UPMAP1B", 
"UPMAP3B", "UPMAP4B", "UPMAP5B", "UPMAP6B", "VAR210R", "VAR310R", 
"VAR310U", "VAR410R", "VAR410U", "OLV110R", "OLV110U", "OLV208R", 
"OLV208U", "THEN10U", "HP37P1B", "HP37P2B", "HP37P4B", "HP4008U", 
"INME03R", "INME03U", "INOA03R", "IPTO04R", "IPTO04U", "IPTO06R", 
"IPTO06U", "OLCAP2B", "OLCAP3B", "OLCAP5B", "PANMP1B", "PANMP2B", 
"PANMP3B", "STIN02R", "STIN02U", "UPMAP1B", "UPMAP3B", "UPMAP4B", 
"UPMAP5B", "UPMAP6B", "VAR210R", "VAR310R", "VAR310U", "VAR410R", 
"VAR410U", "OLV110R", "OLV110U", "OLV208R", "OLV208U", "THEN10U", 
"HP37P1B", "HP37P2B", "HP37P4B", "HP4008U", "INME03R", "INME03U", 
"INOA03R", "IPTO04R", "IPTO04U", "IPTO06R", "IPTO06U", "OLCAP2B", 
"OLCAP3B"), Date = structure(c(18333, 18333, 18333, 18333, 18335, 
18335, 18335, 18338, 18335, 18338, 18335, 18333, 18333, 18333, 
18334, 18334, 18334, 18331, 18331, 18331, 18330, 18330, 18330, 
18330, 18332, 18332, 18332, 18332, 18332, 18325, 18325, 18325, 
18325, 18327, 18327, 18327, 18327, 18327, 18328, 18340, 18340, 
18340, 18340, 18340, 18334, 18334, 18334, 18334, 18336, 18336, 
18336, 18339, 18336, 18340, 18336, 18335, 18334, 18334, 18335, 
18335, 18335, 18332, 18332, 18332, 18331, 18331, 18331, 18331, 
18333, 18333, 18333, 18333, 18333, 18341, 18341, 18341, 18341,
18341, 18335, 18335, 18335, 18335, 18383, 18383, 18383, 18384, 
18384, 18384, 18384, 18385, 18385, 18335, 18342, 18342, 18341, 
18383, 18383, 18345, 18349, 18349, 18349, 18349, 18340, 18339, 
18340, 18341, 18339, 18386, 18386, 18348, 18346, 18347, 18328, 
18328, 18328, 18328, 18390, 18389, 18391, 18392, 18392, 18392, 
18392, 18392, 18392), class = "Date")), row.names = c(NA, -125L
), groups = structure(list(Site = c("HP36P1B", "HP36P3B", "HP36P4B", 
"HP37P1B", "HP37P2B", "HP37P4B", "HP4008R", "HP4008U", "INBS04R", 
"INBS04U", "INME03R", "INME03U", "INOA03R", "IPTO04R", "IPTO04U", 
"IPTO06R", "IPTO06U", "OLCAP2B", "OLCAP3B", "OLCAP5B", "OLV110R", 
"OLV110U", "OLV208R", "OLV208U", "PANMP1B", "PANMP2B", "PANMP3B", 
"SEL107R", "SEL107U", "SEL207R", "SEL207U", "STIN02R", "STIN02U", 
"THEN10U", "UPMAP1B", "UPMAP3B", "UPMAP4B", "UPMAP5B", "UPMAP6B", 
"VAR210R", "VAR310R", "VAR310U", "VAR410R", "VAR410U"), .rows = structure(list(
    30L, 31L, 32L, c(1L, 45L, 79L, 113L), c(2L, 46L, 80L, 114L
    ), c(3L, 47L, 81L, 115L), 33L, c(4L, 48L, 82L, 116L), 34L, 
    35L, c(5L, 49L, 83L, 117L), c(6L, 50L, 84L, 118L), c(7L, 
    51L, 85L, 119L), c(8L, 52L, 86L, 120L), c(9L, 53L, 87L, 121L
    ), c(10L, 54L, 88L, 122L), c(11L, 55L, 89L, 123L), c(12L, 
    56L, 90L, 124L), c(13L, 57L, 91L, 125L), c(14L, 58L, 92L), 
    c(40L, 74L, 108L), c(41L, 75L, 109L), c(42L, 76L, 110L), 
    c(43L, 77L, 111L), c(15L, 59L, 93L), c(16L, 60L, 94L), c(17L, 
    61L, 95L), 36L, 37L, 38L, 39L, c(18L, 62L, 96L), c(19L, 63L, 
    97L), c(44L, 78L, 112L), c(20L, 64L, 98L), c(21L, 65L, 99L
    ), c(22L, 66L, 100L), c(23L, 67L, 101L), c(24L, 68L, 102L
    ), c(25L, 69L, 103L), c(26L, 70L, 104L), c(27L, 71L, 105L
    ), c(28L, 72L, 106L), c(29L, 73L, 107L)), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, -44L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))
library(tidyverse)

df %>% 
  ungroup() %>% 
  group_split(Site) %>% 
  map_df(., ~ .x %>% ungroup() %>%
        arrange(Date) %>%
        mutate(n = 1) %>%
        complete(Date = seq.Date(first(Date), last(Date), by = 'days')) %>%
        group_by(n = cumsum(is.na(n))) %>%
        filter(!is.na(Site)) %>%
        sample_n(1) %>%
        ungroup() %>%
        sample_n(min(n(), 3))) %>%
  select(-n)

# A tibble: 86 x 2
   Date       Site   
   <date>     <chr>  
 1 2020-03-04 HP36P1B
 2 2020-03-04 HP36P3B
 3 2020-03-04 HP36P4B
 4 2020-03-07 HP37P1B
 5 2020-03-12 HP37P1B
 6 2020-03-07 HP37P2B
 7 2020-03-12 HP37P2B
 8 2020-03-07 HP37P4B
 9 2020-03-12 HP37P4B
10 2020-03-04 HP4008R
# ... with 76 more rows