首页 > 解决方案 > 创建一个新变量,标记 R 中绝对值变化的每个实例

问题描述

我正在处理来自运动传感器的处理过的数据,并且需要一些帮助来操作数据集。我的变量包括“时间”(以毫秒为单位)和“肩屈”(以角度为单位)。我想创建一个新变量,每当“肩屈”变量的绝对值变化为 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 度的次数的值。任何帮助将非常感激。

提前致谢。

标签: r

解决方案


根据您拥有的数据量,您可以考虑使用循环。我确实尽量避免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

推荐阅读