2016-02-20 2 views
1

У меня есть два столбца в моем кадре данных, левый столбец, представляющий id, и правый столбец, который содержит увеличивающиеся целые числа, некоторые из которых являются последовательными, а некоторые - нет. Нет повторяющихся целых чисел. Моя цель состоит в том, чтобы получить среднее число последовательных целых чисел в id Например:count среднее число возрастающих последовательных целых чисел R с rle

Вот фрагмент из моего набора данных

station summary id

 
> data 
     id moment 
4448 1 11725 
4540 1 11726 
5457 1 11739 
5519 1 11740 
11733 1 11861 
11797 1 11862 
12020 1 11865 
12313 1 11869 
14576 1 11914 
23314 1 12088 
166 2 11644 
278 2 11646 
339 2 11647 
407 2 11648 
476 2 11649 
545 2 11650 
673 2 11652 
737 2 11653 
982 2 11657 
1035 2 11658 

В приведенном выше примере идентификатор 1 имеет следующее число последовательных целых чисел в moment - 2, 2, 2, 1, 1, 1, 1 - таким образом, среднее значение будет 1.428

ID 2 имеет следующий ряд последовательных целых чисел в moment - 1, 5, 2, 2 - так что среднее будет 2,5

Реальный набор данных имеет ~ 200 строк и 300 уникальных идентификаторов - Я хотел бы среднее для каждого идентификатора.

Я знаю, что вы должны использовать РЛЭ() функцию как-то, и я могу найти максимальное число со следующим кодом:

 
aggregate(data$moment, dat['id'], FUN= function(d) max(rle(diff(d))$lengths)) 

Как бы один взять среднее?

 
> dput(data) 
structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), moment = c(11725L, 11726L, 
11739L, 11740L, 11861L, 11862L, 11865L, 11869L, 11914L, 12088L, 
11644L, 11646L, 11647L, 11648L, 11649L, 11650L, 11652L, 11653L, 
11657L, 11658L)), .Names = c("id", "moment"), row.names = c(4448L, 
4540L, 5457L, 5519L, 11733L, 11797L, 12020L, 12313L, 14576L, 
23314L, 166L, 278L, 339L, 407L, 476L, 545L, 673L, 737L, 982L, 
1035L), class = "data.frame") 

ответ

3

Существует, вероятно, лучше так, но ...

aggregate(data$moment,list(data$id), function(x) mean(rle(diffinv(diff(x)!=1))$lengths)) 
# Group.1  x 
# 1  1 1.428571 
# 2  2 2.500000 

Объяснение

Сначала мы берем разницу. Затем мы ищем те числа, которые не являются последовательными (diff(x)!=1). Затем мы берем обратную разность (diffinv), чтобы вернуться к исходной длине. Теперь мы имеем вектор, который приращается при непересекающихся числах. Возьмите rle, затем длины и, наконец, примените mean, и все готово.

Редактировать 1: Удален шаг, который не нужен.

+0

это сработало спасибо! –

Смежные вопросы