我每秒都收集电力数据(电力)(样本).因此,我的data.frame结构如下:
Test <- data.frame(Sample = c(1:20),
Power = c(0,0,0,0,0,50,67,100,92,0,0,0,36,89,36,0,0,0,89,90))
Run Code Online (Sandbox Code Playgroud)
动力输入的数量取决于人在自行车上进行努力并偶尔休息.因此,电源不会以有序的方式出现.由于没有标记来指示努力何时开始和停止,我想包括这个细节.当功率> 0时可以表征努力,并且可以基于数据组一起评估每个努力的开始/停止.
我现在希望包含一个新列(标记),用于查找组合在一起并用零分隔的功率数据.例如,我的预期输出将是:
Test$Marker <- c("Rest","Rest","Rest","Rest","Rest","Effort 1","Effort 1","Effort 1","Effort 1",
"Rest","Rest","Rest","Effort 2","Effort 2","Effort 2","Rest","Rest","Rest",
"Effort 3","Effort 3")
Run Code Online (Sandbox Code Playgroud)
不幸的是我的原始数据大于3000行,所以手动执行此操作会很繁琐!我怎么能在R中这样做呢?
基数为R的选项:
indx1 = with(rle(Test$Power>0),rep(values,lengths))
indx2 = with(rle(Test$Power>0),rep(cumsum(values),lengths))
Test$Effort[indx1] = paste0("Effort",indx2[indx1])
Test$Effort[!indx1]="Rest"
Run Code Online (Sandbox Code Playgroud)
输出:
Sample Power Effort
1 1 0 Rest
2 2 0 Rest
3 3 0 Rest
4 4 0 Rest
5 5 0 Rest
6 6 50 Effort1
7 7 67 Effort1
8 8 100 Effort1
9 9 92 Effort1
10 10 0 Rest
11 11 0 Rest
12 12 0 Rest
13 13 36 Effort2
14 14 89 Effort2
15 15 36 Effort2
16 16 0 Rest
17 17 0 Rest
18 18 0 Rest
19 19 89 Effort3
20 20 90 Effort3
Run Code Online (Sandbox Code Playgroud)
3,000行约0.0038秒;)希望这有帮助!