根据密集观察创建一个列

时间:2014-03-28 03:13:33

标签: r

我有一个像这样的大型数据集“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”列,这样每当“Day”上有密集观察时(例如,对于主题1,对于“Day”> 2的观察数量,我们有3个观察第1天,第2天观察,第14天观察,第14天观察,第15天观察,因此,第1天和第14天是密集观察,我想将ADDL值给予相应的第一次观察),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

...

这是一个有点复杂的情况,我没有意识到这一点,有人能提出一些想法吗?非常感谢!

1 个答案:

答案 0 :(得分: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))