Идентификация последовательности повторяющихся чисел в R - PullRequest
8 голосов
/ 22 сентября 2011

У меня есть длинный временной ряд, где мне нужно идентифицировать и помечать последовательности повторяющихся значений. Вот некоторые данные:

   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 ]

10 голосов
/ 22 сентября 2011

Как говорит Рамнатх, вы можете использовать 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
7 голосов
/ 22 сентября 2011

Используйте rle, чтобы сделать работу! Это удивительная функция, которая вычисляет количество последовательных повторений чисел в последовательности. Вот пример кода о том, как вы можете использовать rle для пометки злоумышленников в ваших данных. Это вернет все строки из фрейма данных с WDIR, которые повторяются 3 или более раз подряд.

runs = rle(mydf$WDIR)
subset(mydf, WDIR %in% runs$values[runs$lengths >= 3])
1 голос
/ 22 сентября 2011

Два варианта для вас.

Предполагается, что данные загружены:

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

Я подумал, будучи новым пользователем, что вариант 1 может быть более простым пошаговым подходом, хотя изначально rep(table(), table()) может быть не интуитивно понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...