汇总数据框中的分组记录

mon*_*962 2 select r dataframe

我在R中有一个数据框,如下所示:

> TimeOffset, Source, Length 
> 0         1           1500
> 0.1       1           1000    
> 0.2       1           50
> 0.4       2           25
> 0.6       2           3
> 1.1       1           1500
> 1.4       1           18
> 1.6       2           2500
> 1.9       2           18
> 2.1       1           37
> ...
Run Code Online (Sandbox Code Playgroud)

我想把它转换成

> TimeOffset, Source, Length
> 0.2         1       2550
> 0.6         2       28
> 1.4         1       1518
> 1.9         2       2518
> ...
Run Code Online (Sandbox Code Playgroud)

试着把它放到英文中,我想把连续的记录分成相同的'Source',然后打印出每组的一条记录,显示该组中的最高时间偏移,来源和该组中长度的总和.

TimeOffset值将始终增加.

我怀疑这在R中是可能的,但我真的不知道从哪里开始.在紧要关头,我可以导出数据帧,并在例如Python中进行,但如果可能的话,我宁愿留在R中.

提前感谢您提供的任何帮助

Ian*_*ows 6

首先,您需要创建一个id指定组的变量,而不依赖于它们是连续的.之后,它非常直接.

> dat <- data.frame(    TimeOffset = c(0,.1,.2,.4,.6,1.1,1.4,1.6,1.9,2.1),
+ Source=c(1,1,1,2,2,1,1,2,2,1),
+ Length=c(1500,1000,50,25,3,1500,18,2500,18,37))
> dat
   TimeOffset Source Length
1         0.0      1   1500
2         0.1      1   1000
3         0.2      1     50
4         0.4      2     25
5         0.6      2      3
6         1.1      1   1500
7         1.4      1     18
8         1.6      2   2500
9         1.9      2     18
10        2.1      1     37
> 
> id <- cumsum(c(TRUE,diff(dat$Source)!=0))
> id
 [1] 1 1 1 2 2 3 3 4 4 5
> 
> cbind(TimeOffset=tapply(dat$TimeOffset,id,max),
+ Source=tapply(dat$Source,id,max),
+ Length=tapply(dat$Length,id,sum))
  TimeOffset Source Length
1        0.2      1   2550
2        0.6      2     28
3        1.4      1   1518
4        1.9      2   2518
5        2.1      1     37
Run Code Online (Sandbox Code Playgroud)