【发布时间】:2015-05-29 20:14:44
【问题描述】:
我不熟悉 R 中的循环和函数。
假设我有四个样本(A、B、C、D)的每 0.1 个单位的测量值,从 1.0 到 3.5。
我想在 1.5、2.5 和 3.5 附近找到平均测量值(+/- 0.2 个单位)。因此,对于 1.5,我将 c(1.3、1.4、1.5、1.6 和 1.7) 等处的值取平均值。
如何编写语句来总结所有四个样本的这三个平均值?我认为它可能会像这样开始:
X <- (1.5, 2.5, 3.5)
for (i in X)
{
avg <- colMeans(subset(data,data$measurement > (i - 0.2) & data$measurement < (i + 0.2)))
}
我也考虑过改用'[':
colMeans(data[data$measurement > (i-0.2) & data$measurement < (i+0.2)])
到目前为止,感谢您的帮助,sqldf 是一个非常好的工具,该示例正是我想要的!
但是,我无法让它与真实数据集一起使用。我修改了代码,使其看起来像(对不起,这与示例数据集不再对应):
M <- sqldf("select r.i,avg(w.X1),avg(w.X2),avg(w.X3),avg(w.X4)
from Y r, Y w
where w.i betreen r.i - 1 and r.i + 1
group by r.i
having r.i+0.0 in (600, 700, 800)")
为了将其上下文化,我试图总结 599–601、699–701 和 799–801 中所有点的平均值,这四个列分别命名为 X1、X2、X3、X4。我将此数据框命名为“Y”。这些行实际上是波长,数据指向在该波长反射的光量。
你发现上面的代码有什么问题吗? -- 它创建了一个具有正确维度的矩阵,但平均值与更大数据集中的平均值不匹配。我想知道我是否不理解代码中的某些内容,例如,'w' 变量的重要性。
【问题讨论】:
-
使用
cut创建分组变量,然后使用tapply(vals, group, mean)会容易很多,那么1.8、1.9、2.0、2.1、和2.2.你真的应该发布一个示例数据集。
标签: r apply subset moving-average