我正在清理一些数据以进行生存分析,我正在努力使个体只有从症状存在(ss = 1)到症状缓解的单一,持续的过渡(ss = 0)。个人必须具有完整的持续缓解,才能将其视为缓解。除了统计问题/问题,我想知道如何解决下面详述的问题。
我一直在尝试将问题分解为更小,更易于管理的操作和对象,但是,我不断强迫我使用基于直接在缺失值之上和之下的行的条件格式化的解决方案。坦率地说,我对如何做到这一点感到有点失落。如果你认为你知道我可以使用的好技术,试验,或者你知道我在查找解决方案时可以使用的任何好的搜索术语,我会很喜欢一点指导。
详情如下:
#Fake dataset creation
id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4)
time <-c(0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6)
ss <- c(1,1,1,1,NA,0,0,1,1,0,NA,0,0,0,1,1,1,1,1,1,NA,1,1,0,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体和带下划线的字符代表上面数据集的变化
这里的目标是找到一种方法来使ID#1(变量ss)的NA值看起来像这样:1,1,1,1, 1 ,0,0
ID#2(变量ss)如下所示:1,1,0, 0 ,0,0,0
ID#3(变量ss)看起来像这样:1,1,1,1,1,1,NA(没有变化因为带NA的行最终会被删除)
ID#4(变量ss)如下所示:1,1, 1 , 1 , 1 ,0,0(这个需要多次更改,我认为这是最具挑战性的解决方案)。
答案 0 :(得分:0)
我真的不认为你已经考虑了所有&#34;边缘情况&#34;。如何处理一段时间结束时连续两个NA或连续4或5个NA。但是,这将使用na.locf
- 函数:
require(zoo)
fillNA <- function(vec) { if ( is.na(tail(vec, 1)) ){ vec } else { vec <- na.locf(vec) }
}
> mydat$locf <- with(mydat, ave(ss, id, FUN=fillNA))
> mydat
id time ss locf
1 1 0 1 1
2 1 1 1 1
3 1 2 1 1
4 1 3 1 1
5 1 4 NA 1
6 1 5 0 0
7 1 6 0 0
8 2 0 1 1
9 2 1 1 1
10 2 2 0 0
11 2 3 NA 0
12 2 4 0 0
13 2 5 0 0
14 2 6 0 0
15 3 0 1 1
16 3 1 1 1
17 3 2 1 1
18 3 3 1 1
19 3 4 1 1
20 3 5 1 1
21 3 6 NA NA
22 4 0 1 1
23 4 1 1 1
24 4 2 0 0
25 4 3 NA 0
26 4 4 NA 0
27 4 5 0 0
28 4 6 0 0