我有一个像这样的大型数据集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
...
任何人都可以就如何实现这一点提出一些想法吗?非常感谢!
答案 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