2011-09-22 57 views
6

我有很長的時間系列,我需要識別和標記重複值的序列。這裏有一些數據:識別R中重複數字的序列

DATETIME WDIR 
1 40360.04 22 
2 40360.08 23 
3 40360.12 126 
4 40360.17 126 
5 40360.21 126 
6 40360.25 126 
7 40360.29 25 
8 40360.33 26 
9 40360.38 132 
10 40360.42 132 
11 40360.46 132 
12 40360.50 30 
13 40360.54 132 
14 40360.58 35 

所以,如果我需要注意,當值重複三次以上,我有四個「126」序列和三個「132」需要被標記的序列。

我對R非常陌生。我期望我用cbind在這個數組中創建一個新列,並在相應的行中添加一個「T」,但是如何正確填充列是一個謎。任何指針?謝謝一堆。

回答

4

使用rle來完成這項工作!這是一個了不起的功能,可以計算序列中連續數字的重複次數。以下是關於如何使用rle來標記數據中的不法分子的一些示例代碼。這將返回連續重複3次或更多次具有WDIR的數據幀中的所有行。

runs = rle(mydf$WDIR) 
subset(mydf, WDIR %in% runs$values[runs$lengths >= 3]) 
9

正如Ramnath所說,您可以使用rle

rle(dat$WDIR) 
Run Length Encoding 
    lengths: int [1:9] 1 1 4 1 1 3 1 1 1 
    values : int [1:9] 22 23 126 25 26 132 30 132 35 

rle返回具有兩個分量長度和值的對象。我們可以使用長度塊來構建一個新列,以確定哪些值重複三次以上。

tmp <- rle(dat$WDIR) 
rep(tmp$lengths >= 3,times = tmp$lengths) 
[1] FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE 

這將是我們的新專欄。

newCol <- rep(tmp$lengths > 1,times = tmp$lengths) 
cbind(dat,newCol) 
    DATETIME WDIR newCol 
1 40360.04 22 FALSE 
2 40360.08 23 FALSE 
3 40360.12 126 TRUE 
4 40360.17 126 TRUE 
5 40360.21 126 TRUE 
6 40360.25 126 TRUE 
7 40360.29 25 FALSE 
8 40360.33 26 FALSE 
9 40360.38 132 TRUE 
10 40360.42 132 TRUE 
11 40360.46 132 TRUE 
12 40360.50 30 FALSE 
13 40360.54 132 FALSE 
14 40360.58 35 FALSE 
0

兩種選擇適合你。

假設數據被加載:

dat <- read.table(textConnection(" 
DATETIME WDIR 
40360.04 22 
40360.08 23 
40360.12 126 
40360.17 126 
40360.21 126 
40360.25 126 
40360.29 25 
40360.33 26 
40360.38 132 
40360.42 132 
40360.46 132 
40360.50 30 
40360.54 132 
40360.58 35"), header=T) 

選項1:排序

dat <- dat[order(dat$WDIR),] # needed for the 'repeats' to be pasted into the correct rows in next step 
dat$count <- rep(table(dat$WDIR),table(dat$WDIR)) 
dat$more4 <- ifelse(dat$count < 4, F, T) 
dat <- dat[order(dat$DATETIME),] # sort back to original order 
dat 

選項2:Oneliner

dat$more4 <- ifelse(dat$WDIR %in% names(which(table(dat$WDIR)>3)),T,F) 
dat 

我認爲是一個新的用戶那選項 儘管rep(table(), table())最初可能並不直觀,但它可能是一步步簡單的方法。