在R中识别重复数字序列

10

我有一个长时间序列,需要识别和标记连续重复值的序列。以下是一些数据:

   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”,但如何正确填充该列是个谜。请给予任何指导。非常感谢。

3个回答

11

如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

8
使用rle来完成任务!它是一个神奇的函数,可以计算序列中连续重复数字的次数。下面是一些示例代码,演示如何使用rle来标记数据中的不良行为者。这将返回所有具有WDIR的数据框中的行,这些行连续重复3次或更多次。
runs = rle(mydf$WDIR)
subset(mydf, WDIR %in% runs$values[runs$lengths >= 3])

1

有两个选项供您选择。

假设数据已加载:

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: 单行代码

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

我认为作为一个新用户,选项1可能是一种更简单的逐步方法,尽管最初rep(table(), table())可能不直观。


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