提问者:小点点

有没有办法从R中数据帧列中的数据中取平均值?


我有一个数据框,其中第一列表示时间,随后的列(全部49列T-T)保存这些时间点的值。我试着定义时间点t1和t2,取每一列的平均值,然后把这些平均值放在一个向量中,这样就可以用它做向量数学了。换句话说,我要做的向量是第2列(记住第1列是时间)的值在t1和t2上的平均值,接着是第3列t1到t2的平均值,接着是第4列t1到t2的平均值,依此类推。最后,我需要为不同的时间点生成多个向量(A、B和C ),例如,向量A可能有t1和t2期间每列的平均值,但B可能有t3和t4期间每列的平均值。

当谈到编程时,我完全迷失了方向,基本上是一个傻瓜,所以我希望这有意义。欢迎提出任何建议!非常感谢:)

不确定这是否算作可重现的示例,但本质上,我有一个表格,如下所示:

我想定义时间点,比如:t1=1和t2=3,这样我就可以从每列中取这些点的平均值,这样得到的向量将是以下形式:

|1.2|2.2|3.2|4.2|

每个条目来自 (1.1 1.2 1.3)/3 、(2.1 2.2 2.3)/3 等。

再次,非常抱歉,我对这个太陌生了


共1个答案

匿名用户

有几种不同的方法可以做到这一点。我将走过一个希望容易理解的。

这个问题可以分为两部分:

  1. 弄清楚您正在谈论的两次的行号
  2. 取所有列中这些行的平均值。

从任务 1 开始,这应该相当简单。在您的示例中,时间值与行号匹配。如果数据集中也是如此,那么您只需执行以下操作:

startRow <- t1
endRow <- t2

但是,如果这不是真的,那么您必须找到这些索引。您可以在R中使用match函数执行此操作。也就是说,你会这样做:

startRow <- match(t1, df$time)
endRow <- match(t2,df$time)

现在我们有了行的开始和结束索引,我们可以很容易地子集我们的数据框。要获得我们想要的行,我们所要做的就是请求df[startRow: endRow,]即,请求从startRow到endRow的所有行,包括两者。现在,我们所要做的就是获取平均值。我能想到两种方法。一种是像这样使用函数lapplication

lapply(df[startRow:endRow,],ave)

这样做是在数据帧中的每一列上应用平均函数。只需丢弃时间平均值,因为它是无用的。此外,应该注意的是,average返回一个与它所接受的大小相同的列表。也就是说,ave(c(1,2,4)) 返回相当于 c(2.33,2.33,2.33) 的函数。所以,如果你想要一个 x1,x2,....,xn 向量,你必须这样做:

averages <- lapply(df[startRow:endRow,],ave)
lapply(averages[2:length(averages)], function(x) x[1])

averages[2:length(averages)] 选择除时间以外的所有平均值,lapply(averages[2:length(averages)], function(x) x[1])< /code> 获取每个平均值列表并将其减少到 1。

另一种方法是使用循环。你可以做这样的事情来得到你想要的结果:

averages = c()
for(i in 2:dim(df)[2]){
   colAverage <- ave(df[startRow:endRow,i])[1]
   averages <- c(averages, colAverage)
}

您在这里所做的是遍历您的每一列,取平均值,然后将其添加到vector averages