r - 将复杂时间重塑为 R 中的事件数据
问题描述
我有以下数据框,其中有时间的开始、时间的结束和个人获得观察结果 A 或 B 的日期。
df =
id Date Start_Date End_Date A B
1 2 1 4 1 0
1 3 1 4 0 1
2 3 2 9 1 0
2 6 2 9 1 0
2 7 2 9 1 0
2 2 2 9 0 1
我想要做的是按时间顺序排列时间(创建一个新的时间变量),并相应地填写信息A和B,也就是说,如果个人在时间2得到A,它也应该在后续时间(即3 直到 End_Time)。理想情况下,间隔时间不是规则的,而是跟随 Date 的变化(见个人 2):
Cool_df =
id Time A B
1 1 0 0
1 2 1 0
1 3 1 1
1 4 1 1
2 2 0 1
2 3 1 1
2 6 1 1
2 7 1 1
2 9 1 1
任何建议都非常感谢,因为我不知道从哪里开始。
解决方案
这是一种data.table
方法
library(data.table)
setDT(df)
# Summarise dates
ans <- df[, .(Date = unique(c(min(Start_Date), Date, max(End_Date)))), by = .(id)]
# Join
ans[ df[A==1,], A := 1, on = .(id,Date)]
ans[ df[B==1,], B := 1, on = .(id,Date)]
#fill down NA's using "locf"
cols.to.fill = c("A","B")
ans[, (cols.to.fill) := lapply(.SD, nafill, type = "locf"),
by = .(id), .SDcols = cols.to.fill]
#fill other NA with zero
ans[is.na(ans)] <- 0
# id Date A B
# 1: 1 1 0 0
# 2: 1 2 1 0
# 3: 1 3 1 1
# 4: 1 4 1 1
# 5: 2 2 0 1
# 6: 2 3 1 1
# 7: 2 6 1 1
# 8: 2 7 1 1
# 9: 2 9 1 1
推荐阅读
- tfs - 使用 VSS SDK 订阅 tfs 扩展中的事件
- openssl - openvpn VPN 服务器证书检索
- opencv - 进行人脸匹配的差异框架
- git - 更改 Atlassian 密码后,我可以使用新密码登录 Bitbucket,但必须在 GIT 中使用旧密码
- python - 如何在python中正确地将列表列表转换为JSON?
- javascript - jwt.decode() 卡住而不是在格式错误的令牌上返回错误
- c++ - C++ 拉普拉斯展开
- python - 使用字符串拆分的列表理解
- python - 使用 numpy silces 优化 3d 数组算法
- shell - grep 多个并找到多个模式