3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
使用ave..假設(shè)你data.frame名為“mydf”:
mydf$counter <- with(mydf, ave(CustomerID, CustomerID, FUN = seq_along))
mydf
# CustomerID TripDate counter
# 1 1 1/3/2013 1
# 2 1 1/4/2013 2
# 3 1 1/9/2013 3
# 4 2 2/1/2013 1
# 5 2 2/4/2013 2
# 6 3 1/2/2013 1
為了說明它的價(jià)值,我還在我的“splitstackform”包中包含的函數(shù)中實(shí)現(xiàn)了該方法的一個(gè)版本。這個(gè)函數(shù)被調(diào)用getanID:
mydf <- data.frame(IDA = c("a", "a", "a", "b", "b", "b", "b"),
IDB = c(1, 2, 1, 1, 2, 2, 2), values = 1:7)
mydf
# install.packages("splitstackshape")
library(splitstackshape)
# getanID(mydf, id.vars = c("IDA", "IDB"))
getanID(mydf, id.vars = 1:2)
# IDA IDB values .id
# 1 a 1 1 1
# 2 a 2 2 1
# 3 a 1 3 2
# 4 b 1 4 1
# 5 b 2 5 1
# 6 b 2 6 2
# 7 b 2 7 3
從上面的示例中可以看到,我編寫函數(shù)的方式是可以指定一個(gè)或多個(gè)列作為ID列。它檢查是否有任何id.vars被復(fù)制,如果是,那么它將為您生成一個(gè)新的ID變量。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
您也可以使用plyr為此(使用@AnadaMahto的示例數(shù)據(jù)):
> ddply(mydf, .(IDA), transform, .id = seq_along(IDA))
IDA IDB values .id
1 a 1 1 1
2 a 2 2 2
3 a 1 3 3
4 b 1 4 1
5 b 2 5 2
6 b 2 6 3
7 b 2 7 4
甚至:
> ddply(mydf, .(IDA, IDB), transform, .id = seq_along(IDA))
IDA IDB values .id
1 a 1 1 1
2 a 1 3 2
3 a 2 2 1
4 b 1 4 1
5 b 2 5 1
6 b 2 6 2
7 b 2 7 3
請注意plyr沒有最快的解決方案的美譽(yù),因?yàn)槟阈枰匆豢磀ata.table.
這是一個(gè)data.table方法:
library(data.table)
DT <- data.table(mydf)
DT[, .id := sequence(.N), by = "IDA,IDB"]
DT
# IDA IDB values .id
# 1: a 1 1 1
# 2: a 2 2 1
# 3: a 1 3 2
# 4: b 1 4 1
# 5: b 2 5 1
# 6: b 2 6 2
# 7: b 2 7 3

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
idCounter <- function(x) { unlist(lapply(rle(x)$lengths, seq_len))}mydf$TripCounter <- idCounter(mydf$CustomerID)
- 3 回答
- 0 關(guān)注
- 468 瀏覽
添加回答
舉報(bào)