R中data.table用by=1:NROW(DT)可逐行计算,但by=.I不行的原因咨询
为什么data.table中
by=1:NROW(DT)和by=.I结果不同? by=1:NROW(DT)的行为
1:NROW(DT)会生成一个与数据集行数等长的唯一值向量(示例中是1到9),data.table会将这个向量的每个元素作为独立分组——也就是每行单独成组。此时对每个分组计算mean(v),本质就是取该行的v值(因为每组只有一个元素),所以返回9行结果,每行的V1对应原数据的v列数值。
by=.I的行为
.I是data.table的特殊变量,它仅在j参数的计算环境中生效,代表当前分组内的行索引。当你把.I直接放到by参数中时,它不会被解析为逐行的索引标识,反而整个数据集会被当作一个单一分组处理——因为.I在by的环境中没有被拆分为逐行的分组键。此时mean(v)计算的是整个v列的平均值((1+2+…+9)/9=5),所以只返回一行结果。
如果需要用类似索引的方式实现逐行分组,正确的写法是用by=seq_len(.N)(.N在data.table顶层环境中代表总行数),或者直接用by=1:.N,效果和by=1:NROW(DT)完全一致:
DT[, mean(v), by = seq_len(.N)] # 或者 DT[, mean(v), by = 1:.N]
内容的提问来源于stack exchange,提问作者diomedesdata
相关产品推荐
相关产品推荐

