根据零之间的数据添加新列

use*_*568 3 r dataframe

我每秒都收集电力数据(电力)(样本).因此,我的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中这样做呢?

Flo*_*ian 5

基数为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秒;)希望这有帮助!