我的数据框看起来像这样:
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时才会发生变化。
答案 0 :(得分:2)
我们可以使用data.table
来执行此操作。将'data.frame'转换为'data.table'(setDT(df1)
),使用diff
和cumsum
创建分组变量并分配:=
){ {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