2011-09-22 43 views
6

Tôi có chuỗi thời gian dài mà tôi cần xác định và gắn cờ chuỗi các giá trị lặp lại. Dưới đây là một số dữ liệu:Xác định chuỗi các số lặp lại trong 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 

Vì vậy, nếu tôi cần phải lưu ý khi một giá trị được lặp lại ba lần hoặc nhiều hơn, tôi có một dãy bốn '126' và một chuỗi các ba '132' mà cần phải được gắn cờ.

Tôi rất mới với R. Tôi hy vọng tôi sử dụng cbind để tạo cột mới trong mảng này với "T" trong các hàng tương ứng, nhưng cách điền cột đúng cách là một bí ẩn. Bất kỳ con trỏ xin vui lòng? Cảm ơn nhiều.

Trả lời

4

Sử dụng rle để thực hiện công việc !! Nó là một hàm tuyệt vời để tính toán số lần lặp lại liên tục của các số trong một chuỗi. Dưới đây là một số mã ví dụ về cách bạn có thể sử dụng rle để gắn cờ các vi phạm trong dữ liệu của mình. Điều này sẽ trả về tất cả các hàng từ khung dữ liệu có WDIR được lặp lại 3 lần hoặc nhiều lần liên tiếp.

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

Như Ramnath nói, bạn có thể sử dụng 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 trả về đối tượng có hai thành phần, độ dài và giá trị. Chúng tôi có thể sử dụng đoạn độ dài để tạo cột mới xác định giá trị nào được lặp lại nhiều hơn ba lần.

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 

Đây sẽ là cột mới của chúng tôi.

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

Hai tùy chọn cho bạn.

Giả sử dữ liệu được nạp:

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) 

Lựa chọn 1: Sắp xếp

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 

Lựa chọn 2: oneliner

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

tôi nghĩ là một người sử dụng mới Tùy chọn 1 có thể là một bước tiếp cận từng bước dễ dàng hơn mặc dù ban đầu, rep(table(), table()) có thể không trực quan.

Các vấn đề liên quan