我希望通过传感器数据来识别碎片并赋予它们一个ID。因此,我想按Sensor列对以下数据集进行分组,并查看Value行是否从0变为1。当它这样做时,第一块被识别,并且caseid切换为1(如手工列中的caseid)。只要值保持为1,它将保持为1。当它变为0时,它应该切换回0。 在下一个从0到1的切换时,caseid应该变成2,因为传感器识别出第二块,依此类推..
time = c("07:00:01","07:00:01","07:00:01","07:00:02","07:00:02","07:00:02","07:00:03","07:00:03","07:00:03","07:00:04",
"07:00:04","07:00:04","07:00:05","07:00:05","07:00:05","07:00:06","07:00:06","07:00:06","07:00:07","07:00:07",
"07:00:07","07:00:08","07:00:08","07:00:08","07:00:09","07:00:09","07:00:09")
sensor = c(10001,10002,10003,10001,10002,10003,10001,10002,10003,10001,10002,10003,10001,10002,10003,10001,10002,10003,
10001,10002,10003,10001,10002,10003,10001,10002,10003)
values = c(0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,1)
caseid = c(0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,2,0,1,2,0,1)
data = data.frame(time,sensor,values,caseid)
(所以我想获取的是data$caseid这个数据)
我认为可以通过分组实现,但我没有做对,所以我选择了另一种(粗略)的方法。这就是我得到的结果。
data%>%
filter(Sensor=="10002") -> sensor_data_temp
sensor_data_temp$CaseID2 <- NA
case_id = 1
for(i in 1:nrow(sensor_data_temp)){
current_value <- sensor_data_temp[i,"values"]
next_value <- sensor_data_temp[i+1,"values"]
if(i+1 > nrow(sensor_data_temp)){
break
}
if(current_value==0 & next_value==1 || current_value==1 & next_value==1){
sensor_data_temp$CaseID2[i+1] <- case_id
}
else if(current_value==1 & next_value==0){
sensor_data_temp$CaseID2[i+1] <- 0
case_id = case_id +1
}
else{
sensor_data_temp$CaseID2[i+1] <- 0
}
}
我认为这是我可以获取一个传感器的案例ID的方式。但我不知道如何将每个传感器都管理到一个数据框中(就像上面那个)。
我相信有一种更优雅的方法来实现我的目标。
希望有人能帮助我。提前谢谢!:)
lead
函数。 - akrun