我有数据
dat <- data.table(id=1:8, group=c(1,1,2,2,2,3,3,3), val=c(4,10,5,10,10,6,10,10))
> dat
id group val
1: 1 1 4
2: 2 1 10
3: 3 2 5
4: 4 2 10
5: 5 2 10
6: 6 3 6
7: 7 3 10
8: 8 3 10
我希望从每个group
的第一个值中减去。
> res
id group val dif
1: 1 1 4 0
2: 2 1 10 6
3: 3 2 5 0
4: 4 2 10 5
5: 5 2 10 5
6: 6 3 6 0
7: 7 3 10 4
8: 8 3 10 4
我总是对data.table
的效率感到惊讶,所以我想知道它是否能提供解决方案。当然,任何其他有效的方法都是受欢迎的。
答案 0 :(得分:2)
dat[,diff:=val-val[1],by=group]
dat
id group val diff
1: 1 1 4 0
2: 2 1 10 6
3: 3 2 5 0
4: 4 2 10 5
5: 5 2 10 5
6: 6 3 6 0
7: 7 3 10 4
8: 8 3 10 4
答案 1 :(得分:0)
使用Tidyverse(dplyr),你可以这样做:
library(dplyr)
dat <- data.table(id=1:8,
group=c(1,1,2,2,2,3,3,3),
val=c(4,10,5,10,10,6,10,10)
)
dat %>%
group_by(group) %>%
mutate(dif = abs(first(val)-val))
#># A tibble: 8 x 4
#># Groups: group [3]
#> id group val dif
#> <int> <dbl> <dbl> <dbl>
#>1 1 1.00 4.00 0
#>2 2 1.00 10.0 6.00
#>3 3 2.00 5.00 0
#>4 4 2.00 10.0 5.00
#>5 5 2.00 10.0 5.00
#>6 6 3.00 6.00 0
#>7 7 3.00 10.0 4.00
#>8 8 3.00 10.0 4.00