R 统计记录数并在data.table中的每个组内生成行号
我有以下数据表R 统计记录数并在data.table中的每个组内生成行号,r,data.table,R,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 其中,“COUNT”是每个“VAL”的记录/行数,“IDX”是每个“VAL”内的行索引 我尝试使用使用和长度工作 dt[, list(COUNT =
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
其中,“COUNT”是每个“VAL”的记录/行数,“IDX”是每个“VAL”内的行索引
我尝试使用使用和长度工作
dt[, list(COUNT = length(VAL == VAL[.I]),
IDX = which(which(VAL == VAL[.I]) == .I))]
但这不起作用,因为.I
指的是带有索引的向量,所以我想必须使用.I[]
。虽然在.I[]
内部,我再次面临问题,我没有行索引,并且我确实知道(通过阅读data.table
FAQ和下面的文章),如果可能的话,应该避免行循环
那么,data.table
的方式是什么呢 使用.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”
+1定义。和.N、.I
和其他特殊符号记录在?`.[.data.table`
@Frank I以一种似乎过于复杂的方式附加了这个问题:)最好seq\u len(.N)
而不是1:.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