2015-07-03 64 views
3

我正在处理一个正在测量条目和退出的数据帧。有时,在退出标准发生之前,条目的标准会被多次满足,反之亦然。我想删除这些实例。例如,在数据中,第1行中有一个条目,第2行中有另一个条目,第2行中的条目需要出来,因为我们已经是“In”。同样,第6行和第7行需要出来,因为我们已经“出去”了,而且还没有另外一个条目。另外,值得一提的是,如果没有事先录入,就不可能有出口。在没有循环的情况下删除R数据帧中有多个运行的行

我知道我可以用for循环做到这一点,但如果可能的话,我想避免这种情况。我尝试过使用cumsum来筛选0或1的“In”+“Out”的总和,其他任何事情都必须去做。这种方法不起作用。

初始数据帧:

In Out 
1 1 0 
2 1 0 
3 0 -1 
4 1 0 
5 0 -1 
6 0 -1 
7 0 -1 
8 1 0 
9 0 -1 
10 0 -1 

所需的输出:

In Out 
1 1 0 
3 0 -1 
4 1 0 
5 0 -1 
8 1 0 
9 0 -1 

代码来创建初始数据帧:

temp <- structure(list(In = c(1, 1, 0, 1, 0, 0, 0, 1, 0, 0), Out = c(0, 
0, -1, 0, -1, -1, -1, 0, -1, -1)), .Names = c("In", "Out"), row.names = c(NA, 
10L), class = "data.frame") 

谢谢您的帮助。

+2

从“data.table”包中使用'rleid'? – A5C1D2H2I1M1N2O1R2T1

+4

'temp [sequence(rle(temp $ In)$ lengths)== 1,]' – rawr

+0

Rawr,感谢您的建议,如果您将其作为答案,我会接受它。 – mks212

回答

3

尝试

library(data.table)#v1.9.5+ 
setDT(temp)[, ind:=rleid(Out)][,.SD[1L] , by = ind][, ind:=NULL][] 
# In Out 
#1: 1 0 
#2: 0 -1 
#3: 1 0 
#4: 0 -1 
#5: 1 0 
#6: 0 -1 

或者对@基于阿朗的评论

setDT(temp)[, .SD[1L], by = list(ind=rleid(Out)), .SDcols=1:2][,ind:= NULL][] 
+1

或'setDT(temp)[,.SD [1L],by = rleid(Out),.SDcols = 1:2]' – Arun

+0

Akrun,谢谢你的建议。我在之前尝试使用过一个数据表,并且R崩溃了。 – mks212

+0

@ user2926358我在'R 3.2.1'上使用data.table的devel版本,即'data.table_1.9.5'。说明安装它[这里](https://github.com/Rdatatable/data.table/wiki/Installation) – akrun

3

这里是另一种解决方案:

temp[c(TRUE,temp$In[-length(temp$In)]!=temp$In[-1]),] 
0

简单data.table解决方案。不需要v1.9.5

setDT(temp)[c(TRUE , In[-.N] != In[-1])] 
相关问题