首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法隔离数据集中的多个索引点,并在R中的索引点周围隔离时间窗口?

是否有方法隔离数据集中的多个索引点,并在R中的索引点周围隔离时间窗口?
EN

Stack Overflow用户
提问于 2022-01-16 22:25:02
回答 1查看 50关注 0票数 1

我有一个被观察72小时的病人的数据集。病人的氧气水平每4秒测量一次,但由于数据的准确性问题,一些观察不得不移除。因此,病人有不同数量的观察。

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

虽然实际分析并不太困难,但我很难对数据进行细分。例如,我只想在干预开始前300秒和干预后300秒进行观察。我必须考虑到这样一个事实:一个人在时间窗的过程中可能有多种干预措施,而且有多个主题。

下面我提供了一些示例代码来生成数据集,但是如果我遗漏了什么,请告诉我。

代码语言:javascript
复制
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分钟的单次观察,而不是这三点之间的所有观察)。

代码语言:javascript
复制
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:如果我错过了什么,很抱歉,我第一次在这里寻求帮助

EN

回答 1

Stack Overflow用户

发布于 2022-01-17 00:44:42

这是答案。虽然时间很长,但在乞讨干预前300秒钟和乞讨后300秒的集合时间,效果都很好。

如果你想进一步解释,或者我是否误解了什么,请告诉我。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70734691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档