Как установить время равное нулю по группе? - PullRequest
0 голосов
/ 16 февраля 2020

Если у меня есть фрейм данных, который имеет много строк, таких как:

  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"? Я хочу вычесть первый раз для каждого экземпляра этой группы. Например:

  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

Примечание: я набрал некоторое число для действия B, чтобы продемонстрировать, что я имею в виду.

Что я пробовал: я пытался создать функцию и применить функцию с агрегатом :

time_zero <- function(vec){
  result <- (vec$timestamp - vec$timestamp[1])/10E8
  return(result)
}
test <- aggregate(pa, list(pa$`activity label`), FUN = time_zero)

1 Ответ

0 голосов
/ 16 февраля 2020

Мы можем использовать ave здесь:

df$timestamp <- with(df, ave(timestamp, label, FUN = function(x) (x - x[1])/10E8))

С dplyr

library(dplyr)

df %>%
  group_by(label) %>%
  mutate(timestamp = (timestamp - first(timestamp))/10E8)

Или data.table

library(data.table)
setDT(df)[, timestamp := (timestamp - first(timestamp))/10E8, label]

Это вычитает timestamp с first timestamp в каждом label делением на 10E8.

...