在没有循环的R数据帧中删除具有多次运行的行

时间:2015-07-03 16:59:10

标签: r dataframe

我正在使用测量条目和出口的数据框。有时,在退出标准发生之前,条目的条件会多次满足,反之亦然。我想删除这些实例。例如,在数据中,第1行中有一个条目而第2行中有另一个条目,第2行中的条目需要出现,因为我们已经是" In"。同样,第6行和第7行需要出来,因为我们已经" out"而且没有另一个条目。此外,值得一提的是,如果没有事先输入,就不能退出。

我知道我可以使用for循环执行此操作但我希望尽可能避免这种情况。我已经尝试过使用cumsum来过滤" In" +" Out" 0或1,其他任何东西都必须去。这种方法不起作用。

初始数据框:

   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")

感谢您的帮助。

3 个答案:

答案 0 :(得分: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

或基于@ Arun的评论

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

答案 1 :(得分:3)

这是另一种解决方案:

&nbsp;

答案 2 :(得分:0)

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

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