次のようなデータセットがあり、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
これを試して:
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
アナンダが指摘したように、より単純なものを使用できます。
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