有没有办法从 R 中数据框的列中的数据中取平均值?
Is there a way to take averages from data in columns of a data frame in 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 上每一列的平均值。
在编程方面,我完全迷路了,基本上是个菜鸟,所以我希望这是有道理的。任何建议表示赞赏!非常感谢:)
不确定这是否算作一个可重现的例子,但本质上,我有一个 table 比如:
t
col1
col2
col3
col4
1
1.1
2.1
3.1
4.1
2
1.2
2.2
3.2
4.2
3
1.3
2.3
3.3
4.3
4
1.4
2.4
3.4
4.4
5
1.5
2.5
3.5
4.5
我想定义时间点,例如:
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 开始,这应该相当简单。在您的示例中,时间值与行号匹配。如果你的数据集中也是如此,那么你可以简单地做:
startRow <- t1
endRow <- t2
但是,如果事实并非如此,那么您必须找到那些索引。您可以使用 match
函数在 R 中执行此操作。也就是说,你会这样做:
startRow <- match(t1, df$time)
endRow <- match(t2,df$time)
现在我们有了行的开始和结束索引,我们可以很容易地对数据框进行子集化。为了获得我们想要的行,我们所要做的就是请求 df[startRow:endRow,]
即请求从 startRow 到 endRow 的所有行,包括两者。现在,我们所要做的就是获得平均值。我能想到两种方法。一种是像这样使用函数 lapply
:
lapply(df[startRow:endRow,],ave)
这样做是对数据框中的每一列应用平均函数。只需丢弃时间平均值,因为它没用。另外,应该注意的是,average returns 一个与它接收的大小相同的列表。即 ave(c(1,2,4))
returns 等同于 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])
取每个平均值列表并将其减少到 1。
另一种方法是使用循环。你可以这样做来获得你想要的结果:
averages = c()
for(i in 2:dim(df)[2]){
colAverage <- ave(df[startRow:endRow,i])[1]
averages <- c(averages, colAverage)
}
您在这里所做的是遍历每一列,取平均值,然后将其添加到向量 averages
。
我有一个数据框,其中第一列表示时间,后续列(所有 49 列都是 T-T)保存这些时间点的值。我正在尝试定义时间点 t1 和 t2 以在每一列内取平均值,然后将这些平均值排列在一个向量中以便能够用它进行向量数学运算。换句话说,我要制作的向量将具有第 2 列的值的平均值(记住第 1 列是时间)在 t1 和 t2 上,然后是第 3 列的 t1 到 t2 的平均值,然后是通过第 4 列的 t1 到 t2 的平均值等。最后,我需要为不同的时间点制作多个向量(A、B 和 C),例如,向量 A 可能具有每一列的平均值t1 和 t2,但 B 将具有 t3 和 t4 上每一列的平均值。
在编程方面,我完全迷路了,基本上是个菜鸟,所以我希望这是有道理的。任何建议表示赞赏!非常感谢:)
不确定这是否算作一个可重现的例子,但本质上,我有一个 table 比如:
t | col1 | col2 | col3 | col4 |
---|---|---|---|---|
1 | 1.1 | 2.1 | 3.1 | 4.1 |
2 | 1.2 | 2.2 | 3.2 | 4.2 |
3 | 1.3 | 2.3 | 3.3 | 4.3 |
4 | 1.4 | 2.4 | 3.4 | 4.4 |
5 | 1.5 | 2.5 | 3.5 | 4.5 |
我想定义时间点,例如: 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 开始,这应该相当简单。在您的示例中,时间值与行号匹配。如果你的数据集中也是如此,那么你可以简单地做:
startRow <- t1
endRow <- t2
但是,如果事实并非如此,那么您必须找到那些索引。您可以使用 match
函数在 R 中执行此操作。也就是说,你会这样做:
startRow <- match(t1, df$time)
endRow <- match(t2,df$time)
现在我们有了行的开始和结束索引,我们可以很容易地对数据框进行子集化。为了获得我们想要的行,我们所要做的就是请求 df[startRow:endRow,]
即请求从 startRow 到 endRow 的所有行,包括两者。现在,我们所要做的就是获得平均值。我能想到两种方法。一种是像这样使用函数 lapply
:
lapply(df[startRow:endRow,],ave)
这样做是对数据框中的每一列应用平均函数。只需丢弃时间平均值,因为它没用。另外,应该注意的是,average returns 一个与它接收的大小相同的列表。即 ave(c(1,2,4))
returns 等同于 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])
取每个平均值列表并将其减少到 1。
另一种方法是使用循环。你可以这样做来获得你想要的结果:
averages = c()
for(i in 2:dim(df)[2]){
colAverage <- ave(df[startRow:endRow,i])[1]
averages <- c(averages, colAverage)
}
您在这里所做的是遍历每一列,取平均值,然后将其添加到向量 averages
。