我有一个(x,y)点的表,想要创建第二个表来总结这些点。
我希望摘要表中的每一行显示所有y的总和,其中x大于阈值序列。但我无法弄清楚如何将行的阈值加入内部总和。
我已经走到这一步了:
samples <- data.table(x=seq(1,100,1), y=seq(1,100,1))
thresholds = seq(10,100,10)
thresholdedSums <- data.table(xThreshold=thresholds, ySumWhereXGreaterThanThreshold=sum(samples[x > xThreshold, y]))
Error in eval(expr, envir, enclos) : object 'xThreshold' not found
我将如何实现这一目标,还是有不同的方式来做这类事情?
澄清所需的输出:
thresholdedSums =
[
(row 1) threshold = 10, ySumWhereXGreaterThanThreshold = sum of all y values in samples[] where x > 10,
(row 2) threshold = 20, ySumWhereXGreaterThanThreshold = sum of all y values in samples[] where x > 20,
... etc ...
]
答案 0 :(得分:1)
结果可以通过以下代码给出。该解决方案并非完全基于data.table,而是可靠地运行。
thresholdedSums <- data.table(
thres = thresholds,
Sum = sapply(thresholds, function(thres) samples[x > thres, sum(y)])
)
# thres Sum
# 1: 10 4995
# 2: 20 4840
# 3: 30 4585
# 4: 40 4230
# 5: 50 3775
# 6: 60 3220
# 7: 70 2565
# 8: 80 1810
# 9: 90 955
# 10: 100 0
其他说明:sapply(thresholds, function(thres) samples[x > thres, sum(y)])
返回与thresholds
长度相同的向量。您可以将其读作:thresholds
中的每个元素都执行函数function(thres) samples[x > thres, sum(y)]
并将结果作为vector
返回。与for-loop
相比,此过程通常性能更好,更易于阅读。