2014-03-28 92 views
0

我有一個大的數據集「DAT」是這樣的:創建一列基於密集觀察

Sub Day 
1 1 
1 1 
1 1 
1 2 
1 2 
1 14 
1 14 
1 14 
1 15 
1 15 
2 1 
2 1 
2 1 
2 2 
2 2 
2 12 
2 12 
2 12 
2 15 
2 15 
2 16 

...

我想根據「日」以創建一個列「ADDL」等等每當在「日」上有密集觀察時(例如,對於「日」> 2的觀察次數,例如對於受試者1,我們有第3天觀察1天,第2天2天,第14天2天,第15天2天因此,第1天和第14天是密集觀測,我想給ADDL值給它們相應的FIRST觀測值),ADDL =(該主題的最大「日」數) - (對應的「日」數),否則給ADDL零。預期的輸出應該是這樣的:

Sub Day ADDL 
1 1 14 
1 1 0 
1 1 0 
1 2 0 
1 2 0 
1 14 1 
1 14 0 
1 14 0 
1 15 0 
1 15 0 
2 1 15 
2 1 0 
2 1 0 
2 2 0 
2 2 0 
2 12 4 
2 12 0 
2 12 0 
2 15 0 
2 15 0 
2 16 0 

...

這是一個有點複雜的情況,我沒能意識到這一點,任何人都可以給一些想法?非常感謝!

+0

您的描述是沒有意義的。爲什麼對於1,1情況下的14?爲什麼餘下的1,1個案例爲0?爲什麼1爲1,14例?等等 –

+0

...爲什麼15爲Sub 2 Day 1?根據你的描述應該是16。 2,12例也是如此。 – djas

+0

嗨馬特和djas,抱歉的混亂。密集觀測的標準是,只要「天」的觀測值超過2個,我們將其視爲密度,並給出該天數的第一個觀測ADDL值。例如,對於主題1,我們有3個觀察的第1天,第2天的第2天和第14天的第2天,第15天的第2天,因此,第1天和第14天是密集觀察,我想給ADDL值給它們相應的第一個觀察,並且ADDL =(該主題的最大日數) - (第一次觀察的相應日數)。相同的標準適用於主題2. – dzadi

回答

0

我不知道我能嚴格遵循,但下面好像你的輸出匹配:

ff = function(x, dens) { 
    tab = table(x) 
    vals = as.numeric(names(tab)[tab >= dens]) 
    inds = match(vals, x) #'match' for the first observation 
    x[inds] = max(x) - x[inds] 
    x[!seq_along(x) %in% inds] = 0 
    return(x) 
} 
ave(DF$Day, DF$Sub, FUN = function(x) ff(x, dens = 3)) 
# [1] 14 0 0 0 0 1 0 0 0 0 15 0 0 0 0 4 0 0 0 0 0 
ave(DF$Day, DF$Sub, FUN = function(x) ff(x, dens = 2)) 
# [1] 14 0 0 13 0 1 0 0 0 0 15 0 0 14 0 4 0 0 1 0 0 

其中DF

DF = structure(list(Sub = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), Day = c(1L, 1L, 
1L, 2L, 2L, 14L, 14L, 14L, 15L, 15L, 1L, 1L, 1L, 2L, 2L, 12L, 
12L, 12L, 15L, 15L, 16L)), .Names = c("Sub", "Day"), class = "data.frame", row.names = c(NA, 
-21L))