我有一个像这样的大型数据集“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
...
这是一个有点复杂的情况,我没有意识到这一点,有人能提出一些想法吗?非常感谢!
答案 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))