我有以下data.table
set.seed(1)
DT <- data.table(VAL = sample(c(1, 2, 3), 10, replace = TRUE))
VAL
1: 1
2: 2
3: 2
4: 3
5: 1
6: 3
7: 3
8: 2
9: 2
10: 1
在 VAL
中的每个号码中我想:
最后我想要结果
VAL COUNT IDX
1: 1 3 1
2: 2 4 1
3: 2 4 2
4: 3 3 1
5: 1 3 2
6: 3 3 2
7: 3 3 3
8: 2 4 3
9: 2 4 4
10: 1 3 3
其中“COUNT”是每个“VAL”的记录/行数,“IDX”是每个“VAL”中的行索引。
我尝试使用which
与length
和.I
合作:
dt[, list(COUNT = length(VAL == VAL[.I]),
IDX = which(which(VAL == VAL[.I]) == .I))]
但这不起作用,因为.I
指的是带索引的向量,所以我想必须使用.I[]
。虽然在.I[]
里面我再次遇到问题,但我没有行索引,而且我知道(从阅读data.table
常见问题解答并在此处发布帖子),如果可能的话,应该避免循环遍历行。
那么,data.table
方式是什么?
答案 0 :(得分:87)
使用.N
...
DT[ , `:=`( COUNT = .N , IDX = 1:.N ) , by = VAL ]
# VAL COUNT IDX
# 1: 1 3 1
# 2: 2 4 1
# 3: 2 4 2
# 4: 3 3 1
# 5: 1 3 2
# 6: 3 3 2
# 7: 3 3 3
# 8: 2 4 3
# 9: 2 4 4
#10: 1 3 3
.N
是每个组中的记录数,其中的组由"VAL"
定义。