首页 > 解决方案 > 如何将两个不同组的时间设置为零?

问题描述

如果我有一个数据框有很多这样的行:

 subject-id activity label    timestamp          x         y          z
1       1600              A 2.522077e+14 -0.3647613  8.793503  1.0550842
2       1600              A 2.522077e+14 -0.8797302  9.768784  1.0169983
3       1600              A 2.522078e+14  2.0014954 11.109070   2.619156
4       1600              A 2.522078e+14  0.4506226 12.651642 0.18455505
5       1600              A 2.522079e+14 -2.1643524 13.928436 -4.4224854
6       1600              A 2.522079e+14 -4.3327790 13.361191 -0.7188721
.
.
.
  subject-id activity label    timestamp           x          y          z
991      1600             B 2.519876e+14  1.37554930 15.3750460  2.9716187
992      1600             B 2.519877e+14 -3.93443300 17.5387880  2.1100159
993      1600             B 2.519877e+14 -0.08773804 12.7915650 -1.4541016
994      1600             B 2.519878e+14  2.03874200  3.0771484 -1.0537262
995      1600             B 2.519878e+14 -2.55847170 -2.7386780 -2.0985107
996      1600             B 2.519879e+14 -1.35530090  0.3884125 -0.6598511
.
.
.
  subject-id activity label timestamp          x         y           z
24551       1601              A  12865.64  4.7034090  9.127296  0.06404489
24552       1601              A  12865.68  5.3546320 15.635334 -0.62907650
24553       1601              A  12865.72  6.3997010 12.926893  0.45010993
24554       1601              A  12865.76 10.5320930 13.207614 -1.02471830
24555       1601              A  12865.80 16.1297360  2.683301  1.14263270
24556       1601              A  12865.84  0.3932476  6.549937 -3.78224020

如何通过组“主题 ID”和“活动标签”将时间设置为零?我想为该组的每个实例减去第一次。像这样:

  subject-id activity label    timestamp          x         y          z
1       1600              A            0 -0.3647613  8.793503  1.0550842
2       1600              A      .050354 -0.8797302  9.768784  1.0169983
3       1600              A      .100708  2.0014954 11.109070   2.619156
4       1600              A      .151062  0.4506226 12.651642 0.18455505
.
.
.
  subject-id activity label    timestamp           x          y          z
991      1600             B            0  1.37554930 15.3750460  2.9716187
992      1600             B      .049355 -3.93443300 17.5387880  2.1100159
993      1600             B      .100601 -0.08773804 12.7915650 -1.4541016
.
.
.
  subject-id activity label timestamp          x         y           z
24551       1601              A         0  4.7034090  9.127296  0.06404489
24552       1601              A       .04  5.3546320 15.635334 -0.62907650
24553       1601              A      .085  6.3997010 12.926893  0.45010993

注意:我编了一些数字来说明我的意思。

我尝试过的:我尝试使用 dplyr 并按“活动标签”分组。我可以分组两次吗?

pa <- as.data.frame(pa %>% group_by(`activity label`) %>% mutate(timestamp = (timestamp - first(timestamp))/10E8))

标签: rdplyr

解决方案


我们可以在group_by

library(dplyr)
pa <- pa %>% 
          group_by(`subject-id`, `activity label`) %>%
          mutate(timestamp = (timestamp - first(timestamp))/10E8))

推荐阅读