data.table:与第一组的差异

时间:2018-02-27 16:57:35

标签: r data.table

我有数据

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的效率感到惊讶,所以我想知道它是否能提供解决方案。当然,任何其他有效的方法都是受欢迎的。

2 个答案:

答案 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