2016-12-29 50 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