Sử dụng ave
. Giả sử data.frame
được gọi là "mydf" của bạn:
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
Đối với những gì nó có giá trị, tôi cũng thực hiện một phiên bản của phương pháp này trong một chức năng có trong tôi gói "splitstackshape". Hàm được gọi 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
Như bạn có thể nhìn thấy từ ví dụ trên, tôi đã viết các chức năng trong một cách mà bạn có thể chỉ định một hoặc nhiều cột đó phải được coi là cột ID. Nó kiểm tra xem có bất kỳ số nào trong số id.vars
được sao chép hay không và nếu có, thì nó sẽ tạo biến ID mới cho bạn.
Cảm ơn rất nhiều Ananda !, Công trình này! – kaos1511