14

次のようなデータセットがあり、4 つの異なる値を持つことができる列があります。

dataset <- data.frame(out = c("a","b","c","a","d","b","c","a","d","b","c","a"))

R では、特定の値を含む行の累積数を順番に集計する 2 番目の列を作成したいと思います。したがって、出力列は次のようになります。

out
1
1
1
2
1
2
2
3
2
3
3
4
4

2 に答える 2

18

これを試して:

dataset <- data.frame(out = c("a","b","c","a","d","b","c","a","d","b","c","a"))
with(dataset, ave(as.character(out), out, FUN = seq_along))
# [1] "1" "1" "1" "2" "1" "2" "2" "3" "2" "3" "3" "4"

もちろん、次のdata.frameようなものを使用して、出力を列に割り当てることができますout$asNumbers <- with(dataset, ave(as.character(out), out, FUN = seq_along))

アップデート

「dplyr」アプローチも非常に優れています。ロジックは、「data.table」アプローチと非常によく似ています。利点は、上記as.numericのアプローチで必要となる出力をラップする必要がないことです。ave

dataset %>% group_by(out) %>% mutate(count = sequence(n()))
# Source: local data frame [12 x 2]
# Groups: out
# 
#    out count
# 1    a     1
# 2    b     1
# 3    c     1
# 4    a     2
# 5    d     1
# 6    b     2
# 7    c     2
# 8    a     3
# 9    d     2
# 10   b     3
# 11   c     3
# 12   a     4

3 番目のオプションはgetanID、"splitstackshape" パッケージから使用することです。この特定の例では、data.frame(単一の列であるため) 名前を指定するだけで済みますが、一般的には、より具体的に、現在「id」として機能している列に言及すると、関数はそれらが一意であるか、またはそれらを一意にするために累積シーケンスが必要かどうか。

library(splitstackshape)
# getanID(dataset, "out")  ## Example of being specific about column to use
getanID(dataset)
#     out .id
#  1:   a   1
#  2:   b   1
#  3:   c   1
#  4:   a   2
#  5:   d   1
#  6:   b   2
#  7:   c   2
#  8:   a   3
#  9:   d   2
# 10:   b   3
# 11:   c   3
# 12:   a   4
于 2013-03-05T17:39:46.553 に答える
7

アップデート:

アナンダが指摘したように、より単純なものを使用できます。

 DT[, counts := sequence(.N), by = "V1"]

(場所DTは以下の通り)


1に初期化された「カウント」列を作成し、累積合計を係数で集計できます。以下は簡単な実装ですdata.table

# Called the column V1
dataset<-data.frame(V1=c("a","b","c","a","d","b","c","a","d","b","c","a"))

library(data.table)

DT <- data.table(dataset)

DT[, counts := 1L]
DT[, counts := cumsum(counts), by=V1]; DT

#     V1 counts
#  1:  a      1
#  2:  b      1
#  3:  c      1
#  4:  a      2
#  5:  d      1
#  6:  b      2
#  7:  c      2
#  8:  a      3
#  9:  d      2
# 10:  b      3
# 11:  c      3
# 12:  a      4
于 2013-03-05T18:05:21.803 に答える