Совокупное количество каждого значения

Я хочу создать накопительный счетчик количества раз, когда каждое значение появляется.

например скажем, у меня есть столбец:

id  
1  
2  
3  
2  
2  
1  
2  
3

Это станет:

id   count  
1     1  
2     1  
3     1  
2     2  
2     3  
1     2  
2     4  
3     2  

так далее...

Спасибо


person user1165199    schedule 05.04.2012    source источник


Ответы (6)


dplyr способ:

library(dplyr)

foo <- data.frame(id=c(1, 2, 3, 2, 2, 1, 2, 3))
foo <- foo %>% group_by(id) %>% mutate(count=row_number())
foo

# A tibble: 8 x 2
# Groups:   id [3]
     id count
  <dbl> <int>
1     1     1
2     2     1
3     3     1
4     2     2
5     2     3
6     1     2
7     2     4
8     3     2

Это заканчивается группировкой по id. Если вы хотите, чтобы он не был сгруппирован, добавьте %>% ungroup().

person dfrankow    schedule 22.01.2020

Функция ave вычисляет функцию по группе.

> id <- c(1,2,3,2,2,1,2,3)
> data.frame(id,count=ave(id==id, id, FUN=cumsum))
  id count
1  1     1
2  2     1
3  3     1
4  2     2
5  2     3
6  1     2
7  2     4
8  3     2

Я использую id==id для создания вектора всех значений TRUE, которые преобразуются в числовые при передаче в cumsum. Вы можете заменить id==id на rep(1,length(id)).

person Joshua Ulrich    schedule 05.04.2012

Вот способ получить счетчики:

id <- c(1,2,3,2,2,1,2,3)

sapply(1:length(id),function(i)sum(id[i]==id[1:i]))

Что дает вам:

[1] 1 1 1 2 3 2 4 2
person Sacha Epskamp    schedule 05.04.2012
comment
@ user1165199: если это лучший ответ на ваш вопрос, нажмите на галочку. - person Joshua Ulrich; 05.04.2012
comment
Это туз. Привязать его к объекту data.table тоже просто. - person DaveRGP; 25.01.2016

Фрейм данных, который у меня был, был слишком большим, и принятый ответ продолжал падать. Это сработало для меня:

library(plyr)
df$ones <- 1
df <- ddply(df, .(id), transform, cumulative_count = cumsum(ones))
df$ones <- NULL 
person Climbs_lika_Spyder    schedule 06.01.2017

Для полноты добавление пути data.table:

library(data.table)

DT <- data.table(id = c(1, 2, 3, 2, 2, 1, 2, 3))

DT[, count := seq(.N), by = id][]

Выход:

   id count
1:  1     1
2:  2     1
3:  3     1
4:  2     2
5:  2     3
6:  1     2
7:  2     4
8:  3     2
person Jens Adamczak    schedule 29.04.2020

Функция для получения совокупного количества любого массива, включая нечисловой массив:

cumcount <- function(x){
  cumcount <- numeric(length(x))
  names(cumcount) <- x

  for(i in 1:length(x)){
    cumcount[i] <- sum(x[1:i]==x[i])
  }

  return(cumcount)
}
person Gaurav Bansal    schedule 15.10.2018