R如何基于大小类过滤时间序列人口统计数据库

R如何基于大小类过滤时间序列人口统计数据库,r,dplyr,data.table,time-series,R,Dplyr,Data.table,Time Series,[1] 背景:我有一个数据集,其中包括一段时间内珊瑚的个体测量值。我试图根据珊瑚是否在所需的尺寸范围内测量(最大直径(cm)%以%c(1:10)表示),然后计算单个珊瑚内的生长(ID),然后计算所有正在进行的测量,直到珊瑚a.)离开尺寸范围或b.)收缩或保持相同尺寸的第一个测量。对于特定的珊瑚ID,此度量(离开范围或缩小/保持不变)必须是最后一个度量 [2] 过滤标准:这意味着对于每个珊瑚,第一个测量值必须在尺寸范围(1-10)内(参见代码中的过滤器(MinAbove!=1),最后一个测量值必须

[1] 背景:我有一个数据集,其中包括一段时间内珊瑚的个体测量值。我试图根据珊瑚是否在所需的尺寸范围内测量(
最大直径(cm)
%以%c(1:10)表示),然后计算单个珊瑚内的生长(ID),然后计算所有正在进行的测量,直到珊瑚a.)离开尺寸范围或b.)收缩或保持相同尺寸的第一个测量。对于特定的珊瑚ID,此度量(离开范围或缩小/保持不变)必须是最后一个度量

[2] 过滤标准:这意味着对于每个珊瑚,第一个测量值必须在尺寸范围(1-10)内(参见代码中的过滤器(MinAbove!=1),最后一个测量值必须是a。)尺寸范围(1-10)外的第一个测量值或b.)在珊瑚缩小或与前一时间步保持相同大小的大小范围内的第一次测量(
最大直径(cm)
[TimeStep]>=
最大直径(cm)
[TimeStep+1])。这意味着每个珊瑚应该至少有两次测量,可能更多,这取决于有多少次连续测量落在所需的大小范围内。最后,如果数据中出现任何间隙,则珊瑚在范围内测量,然后在多个时间步之后才测量(珊瑚在时间步==1的范围内测量,在时间步==2的范围内未测量,因为不存在行,然后在时间步==3的范围内测量)这些珊瑚应该完全从数据库中删除,因为所有珊瑚生长测量都是按时间步长逐步进行的,在时间步长中,生长总是在连续的时间步长之间进行计算

[3] 在这里,我提供了一个数据集,在该数据集中,我过滤了所有在某个点上至少有一个测量值在所需大小范围内的珊瑚的所有测量值。我需要的是根据珊瑚是否符合第2段中的标准来过滤这些测量值的代码

数据库
然而,到目前为止,我还不能通过这段代码获得所需的输出,我愿意编辑这段代码或采取一种全新的方法(任何最简单的方法)。提前非常感谢

我认为您在按时间步分组时使用了错误的组,这没有多大意义

data_new <- data %>%
  arrange(ID,TimeStep) %>%
  mutate(Shrank = case_when(lag(`Max Diameter (cm)`, n = 1) > `Max Diameter (cm)`~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(InRange = case_when(`Max Diameter (cm)` >= min(size_vect) & `Max Diameter (cm)` <= max(size_vect) ~ TRUE,
                             TRUE ~ FALSE)) %>% 
  mutate(AboveRange = case_when(`Max Diameter (cm)` > max(size_vect) ~ TRUE,
                                TRUE ~ FALSE)) %>%
  mutate(RLE = data.table::rleid(InRange)) %>% 
  mutate(MinIn = min(RLE[InRange]), MinAbove = min(RLE[AboveRange]), MinInTime = min(TimeStep[InRange]), MinShrink = min(TimeStep[Shrank])) %>% 
  filter(MinAbove != 1,
         MinIn < MinAbove & (TimeStep == MinInTime | (TimeStep == MinInTime + 1))) %>% 
  filter(TimeStep <= MinShrink)
数据\u新建%
安排(ID,时间步长)%>%
突变(当(滞后(`Max Diameter(cm)`,n=1)>`Max Diameter(cm)`~真,真~假)时收缩=case_%>%
当(`Max Diameter(cm)`>=min(size\u vect)和`Max Diameter(cm)`%时,变异(InRange=case)
当(`Max Diameter(cm)`>Max(size_vect)~为真时,突变(高于范围=情况),
真~假))%>%
mutate(RLE=data.table::rleid(InRange))%>%
突变(MinIn=min(RLE[InRange])、MinAbove=min(RLE[over range])、MinInTime=min(TimeStep[InRange])、MinShrink=min(TimeStep[shrink])%>%
过滤器(MinAbove!=1,
MinIn%

filter(TimeStep我认为您在按TimeStep分组时使用了错误的组,这没有多大意义

data_new <- data %>%
  arrange(ID,TimeStep) %>%
  mutate(Shrank = case_when(lag(`Max Diameter (cm)`, n = 1) > `Max Diameter (cm)`~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(InRange = case_when(`Max Diameter (cm)` >= min(size_vect) & `Max Diameter (cm)` <= max(size_vect) ~ TRUE,
                             TRUE ~ FALSE)) %>% 
  mutate(AboveRange = case_when(`Max Diameter (cm)` > max(size_vect) ~ TRUE,
                                TRUE ~ FALSE)) %>%
  mutate(RLE = data.table::rleid(InRange)) %>% 
  mutate(MinIn = min(RLE[InRange]), MinAbove = min(RLE[AboveRange]), MinInTime = min(TimeStep[InRange]), MinShrink = min(TimeStep[Shrank])) %>% 
  filter(MinAbove != 1,
         MinIn < MinAbove & (TimeStep == MinInTime | (TimeStep == MinInTime + 1))) %>% 
  filter(TimeStep <= MinShrink)
数据\u新建%
安排(ID,时间步长)%>%
突变(当(滞后(`Max Diameter(cm)`,n=1)>`Max Diameter(cm)`~真,真~假)时收缩=case_%>%
当(`Max Diameter(cm)`>=min(size\u vect)和`Max Diameter(cm)`%时,变异(InRange=case)
当(`Max Diameter(cm)`>Max(size_vect)~为真时,突变(高于范围=情况),
真~假))%>%
mutate(RLE=data.table::rleid(InRange))%>%
突变(MinIn=min(RLE[InRange])、MinAbove=min(RLE[over range])、MinInTime=min(TimeStep[InRange])、MinShrink=min(TimeStep[shrink])%>%
过滤器(MinAbove!=1,
MinIn%

filter(TimeStep我更新了我的数据库以包含更多的数据,并且能够修改我最初提供的代码以获得所需的_数据

size_vect <- seq(from = 1, to = 10,by = 1)

data_new <- data  %>% 
  arrange(ID,TimeStep) %>%
  mutate(Skipped = case_when(TimeStep - lag(TimeStep) > 1 ~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(Shrank_stasis = case_when(lag(`Max Diameter (cm)`, n = 1) >= `Max Diameter (cm)`~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(InRange = case_when(`Max Diameter (cm)` >= min(size_vect) & `Max Diameter (cm)` <= max(size_vect) ~ TRUE,
                             TRUE ~ FALSE)) %>% 
  mutate(AboveRange = case_when(`Max Diameter (cm)` > max(size_vect) ~ TRUE,
                                TRUE ~ FALSE)) %>%
  mutate(RLE = data.table::rleid(InRange)) %>% 
  mutate(MinIn = min(RLE[InRange]), MinAbove = min(TimeStep[AboveRange]), MinInTime = min(TimeStep[InRange]), MinShrink_stasis = min(TimeStep[Shrank_stasis]), MinSkipped = min(TimeStep[Skipped])) %>% 
  filter(MinAbove != 1, # gets rid of all corals that started above the desired size range
         MinIn < MinAbove, # ensures corals started in the range
         TimeStep <= MinAbove & TimeStep <= MinShrink_stasis) %>% # filters for measures before and including when it goes above the size range (a) and filters for measures before and including the first measure when shrinkage or stasis occurs (b)
  filter(is.infinite(MinSkipped)) 
size\u-vect%
突变(当(TimeStep-lag(TimeStep)>1~TRUE,TRUE~FALSE))%>%
当(滞后(`Max Diameter(cm)`,n=1)>=`Max Diameter(cm)`~真,真~假))%>%时,突变(收缩停滞=情况)
当(`Max Diameter(cm)`>=min(size\u vect)和`Max Diameter(cm)`%时,变异(InRange=case)
当(`Max Diameter(cm)`>Max(size_vect)~为真时,突变(高于范围=情况),
真~假))%>%
mutate(RLE=data.table::rleid(InRange))%>%
变异(MinIn=min(RLE[InRange])、MinAbove=min(TimeStep[OverRange])、MinInTime=min(TimeStep[InRange])、MinShrink\u stasis=min(TimeStep[Shrank\u stasis])、Minskiped=min(TimeStep[Skipped])%>%
过滤器(MinAbove!=1,#清除所有超过所需大小范围的珊瑚
MinInTimeStep我更新了我的数据库以包含更多的数据,并且能够修改我最初提供的代码以获得所需的_数据

size_vect <- seq(from = 1, to = 10,by = 1)

data_new <- data  %>% 
  arrange(ID,TimeStep) %>%
  mutate(Skipped = case_when(TimeStep - lag(TimeStep) > 1 ~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(Shrank_stasis = case_when(lag(`Max Diameter (cm)`, n = 1) >= `Max Diameter (cm)`~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(InRange = case_when(`Max Diameter (cm)` >= min(size_vect) & `Max Diameter (cm)` <= max(size_vect) ~ TRUE,
                             TRUE ~ FALSE)) %>% 
  mutate(AboveRange = case_when(`Max Diameter (cm)` > max(size_vect) ~ TRUE,
                                TRUE ~ FALSE)) %>%
  mutate(RLE = data.table::rleid(InRange)) %>% 
  mutate(MinIn = min(RLE[InRange]), MinAbove = min(TimeStep[AboveRange]), MinInTime = min(TimeStep[InRange]), MinShrink_stasis = min(TimeStep[Shrank_stasis]), MinSkipped = min(TimeStep[Skipped])) %>% 
  filter(MinAbove != 1, # gets rid of all corals that started above the desired size range
         MinIn < MinAbove, # ensures corals started in the range
         TimeStep <= MinAbove & TimeStep <= MinShrink_stasis) %>% # filters for measures before and including when it goes above the size range (a) and filters for measures before and including the first measure when shrinkage or stasis occurs (b)
  filter(is.infinite(MinSkipped)) 
size\u-vect%
突变(当(TimeStep-lag(TimeStep)>1~TRUE,TRUE~FALSE))%>%
当(滞后(`Max Diameter(cm)`,n=1)>=`Max Diameter(cm)`~真,真~假))%>%时,突变(收缩停滞=情况)
当(`Max Diameter(cm)`>=min(size\u vect)和`Max Diameter(cm)`%时,变异(InRange=case)
当(`Max Diameter(cm)`>Max(size_vect)~为真时,突变(高于范围=情况),
真~假))%>%
mutate(RLE=data.table::rleid(InRange))%>%
变异(MinIn=min(RLE[InRange])、MinAbove=min(TimeStep[OverRange])、MinInTime=min(TimeStep[InRange])、MinShrink\u stasis=min(TimeStep[Shrank\u stasis])、Minskiped=min(TimeStep[Skipped])%>%
过滤器(MinAbove!=1,#清除所有超过所需大小范围的珊瑚
MinIn就代码而言,这是一项正在进行的工作。我对t感到迷茫
size_vect <- seq(from = 1, to = 10,by = 1)

data_new <- data  %>% 
  arrange(ID,TimeStep) %>%
  mutate(Skipped = case_when(TimeStep - lag(TimeStep) > 1 ~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(Shrank_stasis = case_when(lag(`Max Diameter (cm)`, n = 1) >= `Max Diameter (cm)`~ TRUE, TRUE ~ FALSE)) %>% 
  mutate(InRange = case_when(`Max Diameter (cm)` >= min(size_vect) & `Max Diameter (cm)` <= max(size_vect) ~ TRUE,
                             TRUE ~ FALSE)) %>% 
  mutate(AboveRange = case_when(`Max Diameter (cm)` > max(size_vect) ~ TRUE,
                                TRUE ~ FALSE)) %>%
  mutate(RLE = data.table::rleid(InRange)) %>% 
  mutate(MinIn = min(RLE[InRange]), MinAbove = min(TimeStep[AboveRange]), MinInTime = min(TimeStep[InRange]), MinShrink_stasis = min(TimeStep[Shrank_stasis]), MinSkipped = min(TimeStep[Skipped])) %>% 
  filter(MinAbove != 1, # gets rid of all corals that started above the desired size range
         MinIn < MinAbove, # ensures corals started in the range
         TimeStep <= MinAbove & TimeStep <= MinShrink_stasis) %>% # filters for measures before and including when it goes above the size range (a) and filters for measures before and including the first measure when shrinkage or stasis occurs (b)
  filter(is.infinite(MinSkipped))