【问题标题】:How can I combine rows from two diffrent data sets with a condition on date-time diffrence如何将来自两个不同数据集的行与日期时间差的条件结合起来
【发布时间】:2018-05-07 12:14:21
【问题描述】:

我有两个数据集,分别测量疼痛评分和给药剂量。我把这些数据结合起来。我想根据给定的剂量和疼痛程度将它们结合起来。首先,它应该是第一次给药,然后是疼痛测量,给药后不超过 6 小时。有时会在一次剂量后进行更多的疼痛测量,我需要将它们包括在内。

我尝试循环:

dosage
pain #this are both data sets

> head(pain, n=25)
     ID PROTOCOL COMFORTneo NRSPain           Date_Time
1  2001        6         13       3 2014-09-30 00:00:00
2  2001        6         11       2 2014-09-30 04:00:00
3  2001        6         12       . 2014-09-30 09:00:00
4  2001        6         10       . 2014-09-30 13:00:00
5  2001        6          6       . 2014-09-30 19:00:00
6  2001        6          7       . 2014-09-30 20:00:00
7  2001        6         10       . 2014-10-01 00:00:00
8  2001        6         16       3 2014-10-01 04:00:00
9  2001        6          9       . 2014-10-01 08:00:00
10 2001        6         10       . 2014-11-20 05:00:00
11 2001        6         11       . 2014-11-20 12:00:00
12 2001        6         12       . 2014-11-20 13:00:00
13 2001        6         13       3 2014-11-20 18:00:00
14 2001        6         14       1 2014-11-20 20:00:00
15 2001        6          9       . 2014-11-21 06:00:00
16 2001        6         10       . 2014-11-21 10:00:00
17 2001        6         12       . 2014-11-21 14:00:00
18 2001        6         14       . 2014-11-21 16:00:00
19 2001        6          8       . 2014-11-22 02:00:00
20 2001        6         14       . 2014-11-22 20:00:00
21 2001        6         16       1 2014-11-23 00:00:00
22 2001        6         10       . 2014-11-23 03:00:00
23 2001        6         11       . 2014-11-23 06:00:00
24 2001        6         17       . 2014-11-23 08:00:00
25 2001        6          9       . 2014-11-23 12:00:00
> 

> head(dosage, n=25)
     ID PROTOCOL ADM DOSEBOLUS         DateS_TimeS
1  2001        6   1        40 2014-11-20 11:39:00
2  2001        6   1        20 2014-11-20 18:16:00
3  2001        6   1        20 2014-11-21 00:02:00
4  2001        6   1        20 2014-11-21 06:03:00
5  2001        6   1        20 2014-11-21 12:00:00
6  2001        6   1        20 2014-11-21 18:12:00
7  2001        6   1        20 2014-11-22 00:10:00
8  2001        6   1        20 2014-11-22 06:00:00
9  2001        6   1        20 2014-11-22 12:00:00
10 2001        6   1        20 2014-11-22 17:55:00
11 2001        6   1        20 2014-11-22 23:40:00
12 2001        6   1        20 2014-11-23 06:00:00


#DateS_TimeS is a time of drug administration 

并且 Date_Time 是疼痛评分测量的时间, 我想为每个剂量分配可能的疼痛 不再进行的测量 然后在给药后6小时。

dosage$DateS_TimeS<-as.character(dosage$DateS_TimeS)
pain$Date_Time<-as.character(pain$Date_Time)

dosage$DateS_TimeS<-as_datetime(dosage$DateS_TimeS)
pain$Date_Time<-as_datetime(pain$Date_Time)


df<-NULL

for (i in dosage)
  { for (j in pain) 
  { if (dosage$DateS_TimeS[i] - pain$Date_Time[j] <= 6)
    {df <- rbind(df, cbind(dosage(i), pain(j)))}
    { if (DateS_TimeS(i) - Date_Time(j) > 6)
        { break
          } } } }

但是不工作... 如果您知道任何其他解决方案,请告诉我。或者,如果您知道如何改进 for 循环,我会非常高兴。 谢谢!

【问题讨论】:

  • 查找“数据表非等连接”。
  • 感谢@Gregor 的建议,查找它是一个非常有趣的主题。

标签: r for-loop data-manipulation


【解决方案1】:

你在寻找这样的东西吗?

library(lubridate)
library(dplyr)

dosage$DateS_TimeS_plus6h <- dosage$DateS_TimeS + hours(6)

dosage %>%
  left_join(pain, by=c("ID", "PROTOCOL")) %>%
  filter(Date_Time >=DateS_TimeS & Date_Time <=DateS_TimeS_plus6h) %>%
  select(-DateS_TimeS_plus6h)


#Sample data
> dput(pain)
structure(list(ID = c(2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L), PROTOCOL = c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), 
    COMFORTneo = c(13L, 11L, 12L, 10L, 6L, 7L, 10L, 16L, 9L, 
    10L, 11L, 12L, 13L, 14L, 9L, 10L, 12L, 14L, 8L, 14L, 16L, 
    10L, 11L, 17L, 9L), NRSPain = structure(c(4L, 3L, 1L, 1L, 
    1L, 1L, 1L, 4L, 1L, 1L, 1L, 1L, 4L, 2L, 1L, 1L, 1L, 1L, 1L, 
    1L, 2L, 1L, 1L, 1L, 1L), .Label = c(".", "1", "2", "3"), class = "factor"), 
    Date_Time = structure(c(1412015400, 1412029800, 1412047800, 
    1412062200, 1412083800, 1412087400, 1412101800, 1412116200, 
    1412130600, 1416439800, 1416465000, 1416468600, 1416486600, 
    1416493800, 1416529800, 1416544200, 1416558600, 1416565800, 
    1416601800, 1416666600, 1416681000, 1416691800, 1416702600, 
    1416709800, 1416724200), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("ID", 
"PROTOCOL", "COMFORTneo", "NRSPain", "Date_Time"), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25"), class = "data.frame")

> dput(dosage)
structure(list(ID = c(2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L, 2001L, 2001L), PROTOCOL = c(6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), ADM = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), DOSEBOLUS = c(40L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L), DateS_TimeS = structure(c(1416463740, 
1416487560, 1416508320, 1416529980, 1416551400, 1416573720, 1416595200, 
1416616200, 1416637800, 1416659100, 1416679800, 1416702600), class = c("POSIXct", 
"POSIXt"), tzone = ""), DateS_TimeS_plus6h = structure(c(1416485340, 
1416509160, 1416529920, 1416551580, 1416573000, 1416595320, 1416616800, 
1416637800, 1416659400, 1416680700, 1416701400, 1416724200), class = c("POSIXct", 
"POSIXt"), tzone = "")), .Names = c("ID", "PROTOCOL", "ADM", 
"DOSEBOLUS", "DateS_TimeS", "DateS_TimeS_plus6h"), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"), class = "data.frame")

【讨论】:

  • @KingaFiebig 也许你应该 accept the answer 如果它解决了你的问题,那么这个问题可以被认为是关闭
  • 感谢@Prem 解决了我的问题!对此,我真的非常感激!我很抱歉我迟到的答案,我在这里和数据科学方面都很新,但我会很快学习:)
  • 很高兴它有帮助:)
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多