R识别循环

时间:2016-11-06 14:34:46

标签: r loops

我的数据框看起来像这样:

date             | chamber | value
2016-11-06 16:43 |  1      |   ..
2016-11-06 16:44 |  1      |   ..
2016-11-06 16:45 |  2      |   ..
2016-11-06 16:46 |  2      |   ..
2016-11-06 16:47 |  3      |   ..
2016-11-06 16:48 |  3      |   ..
2016-11-06 16:49 |  1      |   ..

正如你所看到的,我有数据随着时间的推移和某种类型的腔室测量东西。现在我需要一个额外的变量来告诉我我所处的循环,即当循环完成时,应根据日期和时间给新循环一个新的ID,如下所示:

date             | chamber | value | cycle
2016-11-06 16:43 |  1      |   ..  | 201611061643
2016-11-06 16:44 |  1      |   ..  | 201611061643
2016-11-06 16:45 |  2      |   ..  | 201611061643
2016-11-06 16:46 |  2      |   ..  | 201611061643
2016-11-06 16:47 |  3      |   ..  | 201611061643
2016-11-06 16:48 |  3      |   ..  | 201611061643
2016-11-06 16:49 |  1      |   ..  | 201611061649

如果没有for循环,我怎么能这样做,因为for循环对于我庞大的数据集来说太慢了?谢谢

我目前正在这样做,但它太慢了(我的庞大数据集大约需要1小时):

for(i in 2:nrow(df)) # create a cycle counter
{
  df[i,]$cycle <- df[i,]$cycle
  if(df[i,]$chamber < df[i-1,]$chamberON){
    df[i,]$cycle <- format(df[i,]$date,"%Y%m%d%H%M")
  }
}

这里的问题是如何创建一个“循环”变量,该变量仅在“腔室”返回值1时才会发生变化。

1 个答案:

答案 0 :(得分:2)

我们可以使用data.table来执行此操作。将'data.frame'转换为'data.table'(setDT(df1)),使用diffcumsum创建分组变量并分配:=){ {1}}第一个'日期'作为'周期'列。

format

或另一个选项是library(data.table) setDT(df1)[, cycle := format(date[1], "%Y%m%d%H%M"), cumsum(c(TRUE, diff(chamber)< 0))] df1 # date chamber value cycle #1: 2016-11-06 16:43:00 1 .. 201611061643 #2: 2016-11-06 16:44:00 1 .. 201611061643 #3: 2016-11-06 16:45:00 2 .. 201611061643 #4: 2016-11-06 16:46:00 2 .. 201611061643 #5: 2016-11-06 16:47:00 3 .. 201611061643 #6: 2016-11-06 16:48:00 3 .. 201611061643 #7: 2016-11-06 16:49:00 1 .. 201611061649

dplyr