В зависимости от количества имеющихся у вас данных вы можете рассмотреть все 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