R 利用条件寻找最近时间点

R 利用条件寻找最近时间点,r,if-statement,tidyverse,R,If Statement,Tidyverse,假设我有这个数据集 jar_camp jar campaign start_date.time end_date.time 1_pf1.1 1 pf1.1 2019-01-05 10:34:00 2019-01-05 10:41:00 2_pf1.1 2 pf1.1 2019-01-05 10:52:34 2019-01-05 11:03:00 3_pf1.1 3 pf1.1 2019-01-05

假设我有这个数据集

jar_camp    jar campaign    start_date.time      end_date.time
1_pf1.1     1   pf1.1       2019-01-05 10:34:00  2019-01-05 10:41:00
2_pf1.1     2   pf1.1       2019-01-05 10:52:34  2019-01-05 11:03:00
3_pf1.1     3   pf1.1       2019-01-05 11:11:42  2019-01-05 11:21:00
1_pf2.1     1   pf2.1       2019-01-09 10:29:19  2019-01-09 10:39:35
2_pf2.1     2   pf2.1       2019-01-09 10:42:15  2019-01-09 10:53:10
3_pf2.1     3   pf2.1       2019-01-09 10:58:35  2019-01-09 11:10:40
1_pf3.1     1   pf3.1       2019-01-15 10:11:52  2019-01-15 10:22:38
2_pf3.1     2   pf3.1       2019-01-15 10:27:38  2019-01-15 10:38:56
3_pf3.1     3   pf3.1       2019-01-15 10:42:02  2019-01-15 10:52:41
1_pf4.1     1   pf4.1       2019-01-22 09:06:29  2019-01-22 09:17:05
2_pf4.1     2   pf4.1       2019-01-22 09:21:22  2019-01-22 09:31:56
3_pf4.1     3   pf4.1       2019-01-22 09:35:00  2019-01-22 09:47:26
1_pf5.1     2   pf5.1       2019-01-29 10:48:45  2019-01-29 10:59:09
2_pf5.1     3   pf5.1       2019-01-29 11:04:44  2019-01-29 11:18:24
20_pf5.1    1   pf5.1       2019-01-29 15:05:47  2019-01-29 15:16:50
1_pf8.1     1   pf8.1       2019-03-12 08:57:45  2019-03-12 09:07:55
2_pf8.1     2   pf8.1       2019-03-12 09:12:23  2019-03-12 09:22:50
3_pf8.1     3   pf8.1       2019-03-12 09:25:58  2019-03-12 09:36:29
1_pf9.1     1   pf9.1       2019-03-27 08:11:11  2019-03-27 08:21:31
2_pf9.1     2   pf9.1       2019-03-27 08:23:16  2019-03-27 08:33:55
3_pf9.1     3   pf9.1       2019-03-27 08:35:22  2019-03-27 08:46:13


structure                                                                            
   (list(jar_camp = c("1_pf2.1", "2_pf2.1", "3_pf2.1", "1_pf3.1", "2_pf3.1", "3_pf3.1", "1_pf4.1", "2_pf4.1", "3_pf4.1"), 
jar = c(1, 2, 3, 1, 2, 3, 1, 2, 3), campaign = c("pf2.1","pf2.1", "pf2.1", "pf3.1", "pf3.1", "pf3.1", "pf4.1", "pf4.1","pf4.1"), 
start_date.time = structure(c(1547029759, 1547030535,1547031515, 1547547112, 1547548058, 1547548922, 1548147989, 1548148882, 1548149700), 
class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    end_date.time = structure(c(1547030375, 1547031190, 1547032240, 
    1547547758, 1547548736, 1547549561, 1548148625, 1548149516, 
    1548150446), 
class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, -9L), .internal.selfref = <pointer: 0x000001a324ab1ef0>, sorted = "stamp", class = "data.frame") 
对于除campaign=pf1.1之外的每个jar,我希望计算开始日期.time和最近的结束日期.time之间的差值,该差值小于开始日期.time。我该怎么做?我是个新手,主要使用tidyverse

非常感谢

请尝试以下脚本,并将其用作代码的基础。我不太清楚你想要实现什么

convert_to_date <- function(string){
    # Tansform string -> datetime in order to compute difference
    as.POSIXct(string, format = "%Y-%m-%d %H:%M:%S")
}

make_delay_diff <- function(start, end){
    n <- length(start)
    arr_ <- c(0) # Starts with 0 diff

    for(i in 2:n) { # Starts at element 2
        time_diff <- difftime(start[i], end[i - 1], units = "day") # Compute diff in days

        # Set to 0 if have "negative" days
        val <- ifelse(as.numeric(time_diff) < 0, 0, round(time_diff,2))

        arr_ <- append(arr_, val) # Append value and save it
    }

    return(arr_)
}


data %>%
        # group_by(jar) %>%
        arrange(jar, campaign) %>%
        mutate(start_date.time = convert_to_date(start_date.time)) %>% 
        mutate(end_date.time = convert_to_date(end_date.time)) %>%
        mutate(time_diff = make_delay_diff(start_date.time, end_date.time)) 

希望这能帮助你

你能输出你的数据吗?嗨,塞尔吉奥,我在谷歌上搜索了数据输出,并根据我认为你在问的问题编辑了我的问题。干杯,谢谢。我还不完全清楚你需要什么。对于每个罐子和每个营地,您是否只需要减去end_date.time和start_date.time之间的差值?你能给我举一个例子,说明一个罐子的预期输出是什么吗?谢谢你的帮助!我想我问问题时不是很清楚。我需要计算一个罐子被关上的时间,也就是我测量罐子气体的时间。对于每个jar,我希望得到自上次采样以来的时间——开始日期.time和结束日期.time与上次采样jar的时间之差。所以对于jar 1,我想要的第一个区别是pf2.1中的开始日期时间和pf1.1中的结束日期时间之间的区别,例如2019-01-09 10:29:19-2019-01-05 10:41:00=4天,11分41秒。jar 1的下一个时差将在pf3.1开始日期时间和pf2.1结束日期时间之间。例如2019-01-15 10:11:52-2019-01-09 10:39:35谢谢你帮我解决问题!我想我问问题时不是很清楚。我需要计算土壤培养罐气体测量之间的时间。代码提供的是实际测量的时间。对于每个jar,我希望获得开始日期.time和结束日期.time之间的时间差,这与上次对jar进行采样时的时间差不同。这就是我所说的最近的结束时间,即