我正在清理一些数据,以便进行生存分析,并且我试图使它成为一个人只有一个,持续的,从症状出现(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
ID #3 (变量ss)如下所示:1,1,1,1,1,NA (不改变,因为NA的行最终将被删除)
ID #4 (变量ss)如下所示: 1,1,1,1,1,0,0 (这一项需要多个更改,我认为这是最具挑战性的)。
发布于 2016-04-19 04:51:38
我不认为你真的考虑过所有的“边缘案例”。如何处理两个NA在一段时间结束,或4或5个NA在一个连续。然而,这将在您的小测试用例中为您提供所请求的解决方案,但是,可以使用na.locf-function:
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 0https://stackoverflow.com/questions/36708353
复制相似问题