在R数据框中不使用循环删除具有多个连续重复值的行

3
我正在处理一个以进出计量为基础的数据框。有时,在满足进入条件之前,进入条件会多次满足,反之亦然。我想要删除这些情况。例如,在数据中,第1行和第2行都有进入记录,但是在已经“进入”的情况下,第2行的记录需要被删除。同样地,由于已经“离开”且没有其他进入记录,所以第6行和第7行需要被删除。另外,值得一提的是,如果没有先前的进入记录,则不可能有退出记录。
我知道可以使用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")

感谢您的帮助。

2
使用“data.table”包中的rleid函数? - A5C1D2H2I1M1N2O1R2T1
4
筛选出temp$In中RLE编码后长度为1的序列,并返回对应的行。 - rawr
嗷嗷,感谢您的建议,如果您将其作为答案提交,我会接受它。 - mks212
3个回答

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
setDT(temp)[, .SD[1L], by = rleid(Out), .SDcols=1:2] - Arun
Akrun,感谢您的建议。我之前在同一个练习中尝试使用数据表格,但R崩溃了。 - mks212
@user2926358 我正在使用 R 3.2.1 上的 data.table_1.9.5 的开发版本。安装说明在这里 - 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] )]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接