楼主: verbatim
1606 4

[问答] how to calculate time since last dose event? Thanks [推广有奖]

  • 1关注
  • 3粉丝

已卖:25份资源

博士生

5%

还不是VIP/贵宾

-

威望
0
论坛币
513 个
通用积分
2.0505
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
3404 点
帖子
139
精华
0
在线时间
143 小时
注册时间
2006-12-1
最后登录
2020-1-30

楼主
verbatim 发表于 2014-4-24 23:20:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
dat = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), DAY = c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 30L, 30L, 30L, 30L, 30L, 30L,
30L, 30L, 30L, 30L, 30L, 60L, 60L, 60L, 60L, 60L, 60L, 60L, 60L,
60L, 60L, 60L, 1L, 1L, 1L, 30L, 30L, 30L, 60L, 60L, 60L, 1L,
1L, 30L, 30L, 60L, 60L), TIME = c(0, 0, 1.16, 1.89, 2.88, 3.85,
4.95, 5.94, 8.01, 9.89, 24, 49, 49.5, 696, 696, 696.83, 698.01,
699.02, 700.11, 700.91, 702.06, 703.9, 705.93, 720, 1416, 1416,
1417, 1417.82, 1418.96, 1420.02, 1421.13, 1422.04, 1424.12, 1426.03,
1440, 0, 0, 2.09, 696, 696, 698.14, 1416, 1416, 1417.83, 0, 0,
696, 696, 1416, 1416), AMT = c(".", "50000", ".", ".", ".", ".",
".", ".", ".", ".", ".", "", "", ".", "50000", ".", ".", ".",
".", ".", ".", ".", ".", ".", ".", "50000", ".", ".", ".", ".",
".", ".", ".", ".", ".", ".", "50000", ".", ".", "50000", ".",
".", "50000", ".", ".", "50000", ".", "50000", ".", "50000"),
MDV = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L,
0L, 0L, 1L, 0L, 1L, 0L, 1L), EVID = c(0L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L
), II = c(".", "24", ".", ".", ".", ".", ".", ".", ".", ".",
".", "", ".", ".", "24", ".", ".", ".", ".", ".", ".", ".",
".", ".", ".", "24", ".", ".", ".", ".", ".", ".", ".", ".",
".", ".", "24", ".", ".", "24", ".", ".", "24", ".", ".",
"24", ".", "24", ".", "24"), SS = c(".", ".", ".", ".", ".",
".", ".", ".", ".", ".", ".", "", ".", ".", "2", ".", ".",
".", ".", ".", ".", ".", ".", ".", ".", "2", ".", ".", ".",
".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "2", ".",
".", "2", ".", ".", ".", ".", "2", ".", "2"), ADDL = c(".",
"28", ".", ".", ".", ".", ".", ".", ".", ".", ".", "", ".",
".", "29", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".",
"29", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "28",
".", ".", "29", ".", ".", "29", ".", ".", "28", ".", "29",
".", "29"), OBS = 1:50), .Names = c("ID", "DAY", "TIME",
"AMT", "MDV", "EVID", "II", "SS", "ADDL", "OBS"), class = "data.frame", row.names = c(NA,
-50L))

For the above dataset, there are 3 subjects, dose event is indicated by AMT >0, MDV=1, EVID=1, but there are II (interdose interval) and ADDL (additional doses) which means last dose time may not be 0 for the records before second record with AMT >0, for example, for ID=1 and record with OBS= 12 ~14, the last dose time should be 48, 48, 672 and time since last dose event for these three records should be 1, 1.5, 24. Basically the dose was give every 24 hrs and totally 89 doses

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:calculate thanks Thank Event Since structure

本帖被以下文库推荐

沙发
zhangyangsmith 发表于 2014-5-5 17:04:40
  1. # Following your code
  2. # dat = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, ...
  3. # Change all data type to numeric for easy operation
  4. datNew <-
  5.   with(
  6.     dat,
  7.     data.frame(
  8.       ID   = ID,
  9.       DAY  = DAY,
  10.       TIME = TIME,
  11.       AMT  = as.numeric(gsub("\\.", "", AMT)),
  12.       MDV  = MDV,
  13.       EVID = EVID,
  14.       II   = as.numeric(gsub("\\.", "", II)),
  15.       SS   = as.numeric(gsub("\\.", "", SS)),
  16.       ADDL = as.numeric(gsub("\\.", "", ADDL)),
  17.       OBS  = OBS
  18.               )
  19.       )

  20. # Function to do last observation carried forward - LOCF
  21. # see http://stackoverflow.com/questions/1782704/propagating-data-within-a-vector/1783275#1783275
  22. fillInTheBlanks <-
  23.   function(S) {
  24.   ## NA in S are replaced with observed values
  25.   
  26.   ## accepts a vector possibly holding NA values and returns a vector
  27.   ## where all observed values are carried forward and the first is
  28.   ## also carried backward.  cfr na.locf from zoo library.
  29.   L <- !is.na(S)
  30.   c(S[L][1], S[L])[cumsum(L)+1]
  31. }

  32. # Time of dosing recorded in the dataset
  33. datNew$*****S <-
  34.   with(datNew,
  35.        ifelse(EVID == 1, TIME, NA))

  36. # LOCF for *****S, II, & ADDL
  37. datNew$*****S.locf <-
  38.   with(datNew, unlist(tapply(*****S, ID, fillInTheBlanks)))

  39. datNew$II.locf <-
  40.   with(datNew, unlist(tapply(II, ID, fillInTheBlanks)))

  41. datNew$ADDL.locf <-
  42.   with(datNew, unlist(tapply(ADDL, ID, fillInTheBlanks)))

  43. # Time since last dose
  44. datNew$TSLD <-
  45.   with(
  46.     datNew,
  47.     TIME - *****S.locf - pmin(floor(TIME - *****S.locf) %/% II.locf, ADDL.locf)*II.locf
  48.       )
复制代码

藤椅
verbatim 发表于 2014-5-8 23:25:18
> # Time of dosing recorded in the dataset
>  
> datNew$*****S <-
Error: unexpected '^' in "datNew$**"
>  
>   with(datNew,
+  
+        ifelse(EVID == 1, TIME, NA))
[1]   NA    0   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  696   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA 1416   NA   NA   NA   NA
[31]   NA   NA   NA   NA   NA   NA    0   NA   NA  696   NA   NA 1416   NA   NA    0   NA  696   NA 1416

板凳
verbatim 发表于 2014-5-9 01:21:12
when I change *****S to S, I got below dataset (datNew):, however, for the records with OBS = 11, 24, 35, TSLD should be 24 instead of current 0 in datNew. Thanks for further help in advance.

datNew = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), DAY = c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 30L, 30L, 30L, 30L, 30L, 30L,
30L, 30L, 30L, 30L, 30L, 60L, 60L, 60L, 60L, 60L, 60L, 60L, 60L,
60L, 60L, 60L, 1L, 1L, 1L, 30L, 30L, 30L, 60L, 60L, 60L, 1L,
1L, 30L, 30L, 60L, 60L), TIME = c(0, 0, 1.16, 1.89, 2.88, 3.85,
4.95, 5.94, 8.01, 9.89, 24, 49, 49.5, 696, 696, 696.83, 698.01,
699.02, 700.11, 700.91, 702.06, 703.9, 705.93, 720, 1416, 1416,
1417, 1417.82, 1418.96, 1420.02, 1421.13, 1422.04, 1424.12, 1426.03,
1440, 0, 0, 2.09, 696, 696, 698.14, 1416, 1416, 1417.83, 0, 0,
696, 696, 1416, 1416), AMT = c(NA, 50000, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, 50000, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, 50000, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 50000,
NA, NA, 50000, NA, NA, 50000, NA, NA, 50000, NA, 50000, NA, 50000
), MDV = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L,
1L, 0L, 1L, 0L, 1L), EVID = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L,
0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L), II = c(NA, 24, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 24, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, 24, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
24, NA, NA, 24, NA, NA, 24, NA, NA, 24, NA, 24, NA, 24), SS = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, 2, NA, NA, 2, NA, NA, NA, NA, 2, NA,
2), ADDL = c(NA, 28, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 29, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 29, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 28, NA, NA, 29, NA, NA, 29, NA,
NA, 28, NA, 29, NA, 29), OBS = 1:50, S = c(NA, 0, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 696, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, 1416, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, 0, NA, NA, 696, NA, NA, 1416, NA, NA, 0, NA, 696, NA, 1416
), S.locf = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 696,
696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 1416, 1416,
1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 0, 0, 0, 0, 696,
696, 696, 1416, 1416, 0, 0, 0, 696, 696, 1416), II.locf = c(24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24), ADDL.locf = c(28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 29, 29, 29, 29,
29, 28, 28, 28, 29, 29, 29), TSLD = c(0, 0, 1.16, 1.89, 2.88,
3.85, 4.95, 5.94, 8.01, 9.89, 0, 1, 1.5, 24, 0, 0.830000000000041,
2.00999999999999, 3.01999999999998, 4.11000000000001, 4.90999999999997,
6.05999999999995, 7.89999999999998, 9.92999999999995, 0, 24,
0, 1, 1.81999999999994, 2.96000000000004, 4.01999999999998, 5.13000000000011,
6.03999999999996, 8.11999999999989, 10.03, 0, 0, 0, 2.09, 24,
0, 2.13999999999999, 24, 0, 1.82999999999993, 0, 0, 24, 0, 24,
0)), .Names = c("ID", "DAY", "TIME", "AMT", "MDV", "EVID", "II",
"SS", "ADDL", "OBS", "S", "S.locf", "II.locf", "ADDL.locf", "TSLD"
), row.names = c(NA, -50L), class = "data.frame")

报纸
jacosis 发表于 2014-5-9 13:32:50
I did not test your data but have recently dealt with a similar problem. Here I want to show you the method of how to do it.

1. First you need to extract the dosing event together with the unique ID of the data set, and create a new dataframe.

2. Merge the two data sets by the unique ID, which would give you a column of the dosing time.

3. What's left is pretty straightforward. You can simply do a elementary-school math to calculate the time after dosing.

Hope this helps.

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 22:07