2016-12-25 2 views
0

У меня есть список данных, как часть большого кадра данных, он сортируется по времени, так что я не могу изменить порядок списка:подсчета различных значений в R

ID <- c("p","fxman27","duncane" ,"duncane" ,"dday1026" ,"duncane","dday1026","dday1026" ,"dday1026" ,"dday1026","cesandjoel","pali777","ranger_2","marymom6" , "deaglekl") 

Теперь мне нужна функция чтобы произвести этот подсчет этих идентификаторов:

s<-c(1 , 2 ,3 , 3 , 4, 4 ,4 , 4 , 4 ,4 , 5, 6, 7, 8 , 9) 

как вы можете видеть, количество функций число различных идентификаторов и остается неизменным, если идентификатор совпадает в предыдущей строке. Я не хочу использовать «для» циклов и предпочитаю функции BASE.

«s» - это не простая таблица частот, поскольку я знаю, что могу использовать агрегат. Это не группировка вопрос, но число «ток Id» является аукционы Благодаря

+0

использовать функцию 'count' из пакета' plyr'. 'plyr :: count (ID)' –

+0

Попробуйте 'match (ID, unique (ID))' –

+0

@JakeConway Это не даст желаемого результата –

ответ

1

Если набор данных велик, вы можете быть лучше используя dplyr, но это решает пример с базовыми функциями:

apply(as.matrix(1:length(ID)), 1, function(n) length(unique(ID[1:n]))) 
+1

Это петля. Кроме того, как dplyr здесь связан? Наконец, почему преобразование вектора в матрицу, а не просто использование 'sapply' над ним? –

+0

Я думал об использовании 'dplyr :: n_distinct'. Вы правы, 'sapply (1: length (ID), function (n) length (unique (ID [1: n]))), вероятно, будет лучшей реализацией этого. Однако подход @psidom в конечном итоге лучше. – user3349904

7

Вы можете рассчитывать, не дублированные идентификаторы:

cumsum(!duplicated(ID)) 
# [1] 1 2 3 3 4 4 4 4 4 4 5 6 7 8 9 
Смежные вопросы