标准化每个人的时间点

时间:2014-03-24 20:14:05

标签: r

我有一个像这样的大型数据集dat

SUB  TIME
 1   0.16
 1   0.76
 1   1.15
 1   1.48
 1   2
 1   2.98
 1   3.98
 1   4.96
 1   8.98
 1   12.13
 1   12.73
 2   0.18
 2   0.75
 2   1.16
 2   1.5
 2   2
 2   3.05
 2   3.98
 2   5.01
 2   8.96
 2   12.1
 2   12.7
 2   13.1
 ...

我想标准化每个人的时间点,以便每个人都从0开始。预期的输出应该如下所示:

SUB TIME
1   0
1   0.6
1   0.99
1   1.32
1   1.84
1   2.82
1   3.82
1   4.8
1   8.82
1   11.97
1   12.57
2   0
2   0.57
2   0.98
2   1.32
2   1.82
2   2.87
2   3.8
2   4.83
2   8.78
2   11.92
2   12.52
2   12.92
...

任何人都可以就如何实现这一点提出一些想法吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

看起来您想要按组减去第一个值(如果已排序,最小值为o / w)。我会使用ave来实现此目的,它允许您按组应用函数并返回相同长度的向量。

tmp <- textConnection("SUB  TIME
 1   0.16
 1   0.76
 1   1.15
 1   1.48
 1   2
 1   2.98
 1   3.98
 1   4.96
 1   8.98
 1   12.13
 1   12.73
 2   0.18
 2   0.75
 2   1.16
 2   1.5
 2   2
 2   3.05
 2   3.98
 2   5.01
 2   8.96
 2   12.1
 2   12.7
 2   13.1")
dat <- read.table(tmp, header=TRUE)
dat$norm1 <- ave(dat$TIME, dat$SUB, FUN=function(x) x - x[1])
dat$norm2 <- ave(dat$TIME, dat$SUB, FUN=function(x) x - min(x))

这会产生:

> head(dat)
  SUB TIME norm1 norm2
1   1 0.16  0.00  0.00
2   1 0.76  0.60  0.60
3   1 1.15  0.99  0.99
4   1 1.48  1.32  1.32
5   1 2.00  1.84  1.84
6   1 2.98  2.82  2.82