我正在使用测量条目和出口的数据框。有时,在退出标准发生之前,条目的条件会多次满足,反之亦然。我想删除这些实例。例如,在数据中,第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")
感谢您的帮助。
答案 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)
这是另一种解决方案:
答案 2 :(得分:0)
简单data.table
解决方案。不需要v1.9.5
setDT(temp)[c( TRUE , In[-.N] != In[-1] )]