Как переписать столбец на основе двух разных групп - PullRequest
2 голосов
/ 20 февраля 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 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

Как я могу установить нулевое время для группы "идентификатор субъекта" и "метка активности", а затем увеличить на 0,05 до остальной части группы, когда я двигаюсь вниз по строкам. Например:

  subject-id activity label    timestamp          x         y          z
1       1600              A            0 -0.3647613  8.793503  1.0550842
2       1600              A          .05 -0.8797302  9.768784  1.0169983
3       1600              A          .10  2.0014954 11.109070   2.619156
4       1600              A          .15  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          .05 -3.93443300 17.5387880  2.1100159
993      1600             B          .10 -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       .05  5.3546320 15.635334 -0.62907650
24553       1601              A       .10  6.3997010 12.926893  0.45010993

Я пытался использовать функцию dplyr, потому что в долгосрочной перспективе у меня не получается с циклами. Я пробовал следующее, но я не могу понять, каким должен быть аргумент для mutate:

test <- as.data.frame(df %>% group_by(`activity label`, `subject-id`) %>% mutate(timestamp = ???))

Разве я не должен использовать mutate ()? Должен ли я использовать do ()?

1 Ответ

2 голосов
/ 20 февраля 2020

Мы можем использовать seq для создания последовательности, начинающейся с 0, с шагом 0,05 с длиной как количеством строк в каждой группе.

library(dplyr)

df %>%
  group_by(`activity label`, `subject-id`) %>%
  mutate(timestamp = seq(0, by = 0.05, length.out = n()))

n() дает количество строк, так как наши данные сгруппированный здесь дает количество строк в каждой группе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...