Создание новой переменной, которая помечает каждый случай изменения абсолютного значения в R - PullRequest
1 голос
/ 25 февраля 2020

Я работаю с обработанными данными с датчиков движения и хотел бы помочь с манипулированием набором данных. Мои переменные включают «Время» (в миллисекундах) и «Сгибание плеча» (в углах). Я хочу создать новую переменную, которая будет отмечать каждый раз, когда в переменной «Плечо сгибание» изменяется абсолютное значение на 3 градуса. Что-то вроде:

newdata <- mydata %>%
    mutate(changevariable = ifelse(Shoulder.Flexion = [absolute value change in 3 degrees], "1", "0")

, где каждый флаг / "1" находится в последовательности ± 3 градуса.

Пример моего набора данных:

structure(list(Time = c(0, 0.0078125, 0.015625, 0.023438, 0.03125, 
0.039062, 0.046875, 0.054688, 0.0625, 0.070312, 0.078125, 0.085938, 
0.09375, 0.10156, 0.10938, 0.11719, 0.125, 0.13281, 0.14062, 
0.14844), Shoulder.Flexion = c(-9.4721, -12.098, -12.51, 12.253, 
11.815, 11.385, 11.03, 10.766, 10.586, 10.472, 10.408, 10.381, 
10.383, 10.407, 10.453, 10.521, 10.605, 10.695, 10.778, 10.846
)), row.names = c(NA, 20L), class = "data.frame")

Это помогает мне сгенерировать значение числа раз, которое субъект поворачивает на 3 градуса за указанный промежуток времени. Любая помощь будет высоко ценится.

Заранее спасибо.

1 Ответ

1 голос
/ 26 февраля 2020

В зависимости от количества имеющихся у вас данных вы можете рассмотреть все oop. Я стараюсь избегать циклов for в целом и думаю, что решение data.table, вероятно, будет более полезным и предпочтительным.

mydata$Shoulder.Flexion = c(9,10,10.5,11.7,12.1,13,13.5,14,15.9,16.2,17.4,18.6,19,18.5,17.5,17,15,14,13,12)

ref = mydata[1,2]
mydata$changevariable <- 0

for (i in 2:nrow(mydata)) {
  if (abs(mydata[i, 2] - ref) >= 3) {
    mydata[i, "changevariable"] <- 1
    ref = mydata[i, 2]
  }
}

Вывод

        Time Shoulder.Flexion changevariable
1  0.0000000              9.0              0
2  0.0078125             10.0              0
3  0.0156250             10.5              0
4  0.0234380             11.7              0
5  0.0312500             12.1              1
6  0.0390620             13.0              0
7  0.0468750             13.5              0
8  0.0546880             14.0              0
9  0.0625000             15.9              1
10 0.0703120             16.2              0
11 0.0781250             17.4              0
12 0.0859380             18.6              0
13 0.0937500             19.0              1
14 0.1015600             18.5              0
15 0.1093800             17.5              0
16 0.1171900             17.0              0
17 0.1250000             15.0              1
18 0.1328100             14.0              0
19 0.1406200             13.0              0
20 0.1484400             12.0              1

Редактировать :

Пока неясно, что нужно. Было бы полезно иметь «окончательный» желаемый фрейм данных, который включает changevariable для ваших данных выборки. Это также может помочь иметь различные выборочные данные, которые также имеют больше изменений, превышающих 3 градуса.

Вот еще одна версия в базе R, которая вычисляет различия между строками, принимает абсолютное значение этих различий, а затем проходит через эти различия, чтобы рассчитать совокупную сумму. Когда сумма больше 3, тогда changevariable устанавливается в 1, а совокупная сумма сбрасывается в ноль.

Дайте мне знать, если это ближе:

mydata$diff <- ave(mydata$Shoulder.Flexion, FUN = function(x) c(0, abs(diff(x))))

total = 0
mydata$changevariable <- 0

for (i in 2:nrow(mydata)) {
  total <- total + mydata[i, "diff"]
  if (total >= 3) {
    mydata[i, "changevariable"] <- 1
    total = 0
  }
}

        Time Shoulder.Flexion    diff changevariable
1  0.0000000          -9.4721  0.0000              0
2  0.0078125         -12.0980  2.6259              0
3  0.0156250         -12.5100  0.4120              1
4  0.0234380          12.2530 24.7630              1
5  0.0312500          11.8150  0.4380              0
6  0.0390620          11.3850  0.4300              0
7  0.0468750          11.0300  0.3550              0
8  0.0546880          10.7660  0.2640              0
9  0.0625000          10.5860  0.1800              0
10 0.0703120          10.4720  0.1140              0
11 0.0781250          10.4080  0.0640              0
12 0.0859380          10.3810  0.0270              0
13 0.0937500          10.3830  0.0020              0
14 0.1015600          10.4070  0.0240              0
15 0.1093800          10.4530  0.0460              0
16 0.1171900          10.5210  0.0680              0
17 0.1250000          10.6050  0.0840              0
18 0.1328100          10.6950  0.0900              0
19 0.1406200          10.7780  0.0830              0
20 0.1484400          10.8460  0.0680              0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...