【问题标题】:Is there a way to isolate multiple index points in a dataset and isolate a time window around that index point in R?有没有办法隔离数据集中的多个索引点并在 R 中隔离该索引点周围的时间窗口?
【发布时间】:2022-01-16 22:25:02
【问题描述】:

我有一个数据集,其中包含接受 72 小时观察的患者。每 4 秒测量一次患者的氧气水平,但由于数据准确性问题,必须删除一些观察结果。因此,患者有不同数量的观察结果。

在观察患者的同时,他们接受了各种干预措施。我分析的目的是评估干预措施是否影响患者的氧气水平。因此,我正在对干预前、干预期间和干预后的氧气水平进行比较。

虽然实际分析并不太难,但我很难对数据进行子集化。例如,我只想要干预开始前 300 秒和干预后 300 秒的观察结果。我必须考虑一个事实,即一个人在时间窗的过程中可能有多次干预,并且有多个受试者。

我在下面提供了一些示例代码来生成数据集,但如果我遗漏任何内容,请告诉我。

id <- rep(c(1,2,3), each = 1000)
intervention <- c(rep(0,200), rep(1,10), rep(0,153), rep(0,5), rep(0,284), rep(0,20), rep(0,159), rep(0,23), rep(0,146),
                  rep(0,123), rep(1,23), rep(0,356), rep(1,8), rep(0,234), rep(1,23), rep(0,233),
                  rep(0,345), rep(1,12), rep(0,48), rep(1,15), rep(0,74), rep(1,4), rep(0,233), rep(1,82), rep(0,187))
final <- data.frame(id, intervention)
final <- final %>%
  group_by(id) %>%
  mutate(time = row_number() * 4) 

到目前为止,我已经尝试过这种方法,但我只能隔离干预前后 5 分钟的单个观察结果,而不是这些时间窗之间的所有观察结果(即干预开始前 5 分钟的单个观察结果和干预后 5 分钟的单次观察,但不是这三点之间的所有观察)

data <- final4 %>%
  filter(intervention == 1) %>%
  mutate(five_mins_after = time + 300, #5 mins after intervention
         five_mins_before = time - 300) %>% #5 mins before intervention %>%
  filter(id == "1")

data2 <- final4 %>%
  filter(intervention == 0,
        id == "1")

data_after <- data %>%
  dplyr::select(five_mins_after)

data_before <- data %>%
  dplyr::select(five_mins_before)

data3 <- merge(data2, data_after, by.x = "time", by.y = "five_mins_after")
data4 <- merge(data2, data_before, by.x = "time", by.y = "five_mins_before")

final <- final %>%
  dplyr::bind_rows(data3) %>%
  dplyr::bind_rows(data4)
  

如果您需要任何其他信息,请告诉我,感谢您的宝贵时间!

PS:如有遗漏,第一次在这里寻求帮助表示歉意

【问题讨论】:

    标签: r dplyr subset


    【解决方案1】:

    这就是答案。虽然很长,但它可以很好地收集干预开始前 300 秒和干预开始后 300 秒的时间。

    如果您需要进一步的解释或者我有什么误解,请告诉我。

    library(magrittr)
    library(tidyverse)
    
    ### Sample code
    id <- rep(c(1,2,3), each = 1000)
    intervention <- c(rep(0,200), rep(1,10), rep(0,153), rep(0,5), rep(0,284), rep(0,20), rep(0,159), rep(0,23), rep(0,146),
                      rep(0,123), rep(1,23), rep(0,356), rep(1,8), rep(0,234), rep(1,23), rep(0,233),
                      rep(0,345), rep(1,12), rep(0,48), rep(1,15), rep(0,74), rep(1,4), rep(0,233), rep(1,82), rep(0,187))
    final <- data.frame(id, intervention)
    final <- final %>%
      group_by(id) %>%
      mutate(time = row_number() * 4) 
    
    ### Start of data processing to get wanted observations
    
    # Order it by id and time
    final %<>% arrange(id, time)
    
    # Loop over the unique ids
    obs_to_keep <- list()
    for(i in unique(final$id)) {
      
      # Get starts of treatment
      time_zero_intervention <- final %>% 
        filter(id == i & intervention == 0) %>% 
        select(time)
      
      # Obtain all times after zero interventions, that could be intervention == 1
      time_plus_4 <- time_zero_intervention$time + 4
      
      # Where in the times after 0 intervention there is a 1 intervention
      starts_of_interventions <- final %>% 
        filter(id == i & time %in% time_plus_4) %>% 
        filter(intervention == 1)
      
      # Loop over each one of the times where intervention starts
      all_times <- list()
      for(n in 1:length(starts_of_interventions$time)) {
        # Gather 300 secs prior and post
        time_300_before <- starts_of_interventions$time[n] - 300
        time_300_after <- starts_of_interventions$time[n] + 300
        
        # Filter for observations in this interval
        all_times[[n]] <- final %>%
          filter(id == i) %>%
          filter(time >= time_300_before & time <= time_300_after)
      }
      if(length(all_times) == 1){
        obs_to_keep[[i]] <- as.data.frame(all_times)
      }
      else {
        obs_to_keep[[i]] <- do.call(rbind, all_times)
      }
    }
    
    # Make a data frame from the list
    df <- do.call(rbind, obs_to_keep)
    
    # Order it by id and time
    df %<>% arrange(id, time)
    

    【讨论】:

    • 您好,非常感谢您的帮助!只是想知道,您的编码方式是找到事件从 0 变为 1 时的第一个实例,还是进行编码以便捕获 0 的第一个实例?
    • 它会找到 1 的第一个实例,以及从 0 到 1 的所有转换,我将其理解为个人进行多次干预的开始。这是正确的,还是多个干预措施会是不同于 1 的数字(例如 2)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2020-05-30
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多