web-dev-qa-db-ja.com

Rの累積カウント

オブジェクトがRの列に累積的に表示される回数をカウントする方法はありますか?

例えば私が列を持っていると言う:

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  

等...

ありがとう

27
user1165199

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()を追加します。

1
dfrankow

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))に置き換えることができます。

29
Joshua Ulrich

カウントを取得する方法は次のとおりです。

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
9
Sacha Epskamp

私が持っていたデータフレームが大きすぎて、受け入れられた答えがクラッシュし続けました。これは私のために働いた:

library(plyr)
df$ones <- 1
df <- ddply(df, .(id), transform, cumulative_count = cumsum(ones))
df$ones <- NULL 
3

非数値配列を含む任意の配列の累積カウントを取得する関数:

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)
}
1
Gaurav Bansal