因tapply返回顺序存疑,寻求分组向量偏移的更优实现方法
解决方案
直接使用R基础包中的ave()函数替代tapply(),它会严格保留原数据的行顺序,完美满足你的全部要求:
d$value <- ave(d$value, d$source, FUN = function(v) v - v[1])
方案说明
ave()是R原生函数,无需依赖任何第三方库;- 代码为单行形式,符合要求;
- 底层采用向量化运算,没有显式循环;
- 不会对原始数据框执行排序或合并操作,返回结果的顺序与原数据完全匹配,彻底解决
tapply()返回顺序不确定的可靠性问题。
测试验证
用你提供的测试数据验证:
d <- data.frame(value = c(1,2,3,5), source = c("a","a","b","b")) d$value <- ave(d$value, d$source, FUN = function(v) v - v[1])
执行后得到的结果符合预期:
value source 1 0 a 2 1 a 3 0 b 4 2 b
内容的提问来源于stack exchange,提问作者Taylor
相关产品推荐
相关产品推荐

