繁体   English   中英

data.table:与组首位的差异

[英]data.table: difference to first of group

我有资料

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

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

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM