2016-12-29 30 views
0

我想知道两列相同的运行长度。例如,下面的数据:在R中使用多个列的rle

v1 v2 
1 1 
1 1 
1 2 
1 3 
2 3 
2 4 
2 4 

我想类似RLE的功能是什么单个列东西,将返回(2,1,1,1,2)。有没有一个简单的函数可以做到这一点(或者也可以使用rle函数来处理这种情况)?

回答

4

我们可以paste列在一起,适用rle并获得lengths

rle(do.call(paste0, df1))$lengths 
#[1] 2 1 1 1 2 

或用data.table

library(data.table) 
setDT(df1)[, .N, .(v1, v2)]$N 
#[1] 2 1 1 1 2 

或者更好的办法是用rleiddata.table

setDT(df1)[, .N, rleid(v1, v2)]$N 
+1

类似于'paste0'的另一种解决方案:'library(tidyr); rle(unite(df1,v,1:ncol(df1),sep =“”)$ v)$ lengths' –

+0

data.table如果在输入数据中有'v1'和'v2'值相同组合的另一条纹,setDT(df1)[,.N,。(v1,v2)] $ N'的解决方案将失败。例如。将其应用于'df2 < - rbind(df1,df1)',您将得到'4 2 2 2 4',而正确的答案是'2 1 1 1 2 2 1 1 1 2'。 – Uwe

+0

@UweBlock是的,你是对的。所以,我在你评论中提到的案例中包含了'rleid'。 – akrun