R data.table显式求和与.SD分组求和结果不一致问题咨询
data.table分组求和结果差异的原因分析
这是data.table的预期行为,核心差异来自于对分组列的两种不同处理逻辑:
第一种写法
DT[, .(suma = sum(A), sumb = sum(B), sumc=sum(C), sumd= sum(D)), by=A]:
当使用by=A分组时,data.table会对分组列A做优化——每个分组内的A值完全相同,因此会被简化为单个值(而非保留重复的5个值)。此时sum(A)本质是对长度为1的向量求和,结果自然就是该组的A值本身(比如A=1的组,sum(A)=1)。第二种写法
DT[, lapply(.SD, sum), by=A, .SDcols=c('A' ,'B','C','D')]:.SD代表每个分组内的完整行数据集(包含.SDcols指定的所有列的全部行),即便是分组列A,在.SD里也会保留该组内的所有5个重复值。因此sum(.SD$A)是对5个相同的A值求和,得到的结果就是A*5(比如A=1的组,sum后为5)。
可以通过以下代码验证这一逻辑:
# 查看分组后直接引用A的长度 DT[, .(len_A = length(A)), by=A] # 查看.SD中A列的长度 DT[, .(len_SD_A = length(.SD$A)), by=A, .SDcols='A']
内容的提问来源于stack exchange,提问作者RSA
相关产品推荐
相关产品推荐

