如何从df计算每n个向量的平均值
Posted
技术标签:
【中文标题】如何从df计算每n个向量的平均值【英文标题】:How to calculate the mean for every n vectors from a df 【发布时间】:2021-12-18 08:30:52 【问题描述】:如何计算来自 df 的每 n 个向量的平均值,并使用结果创建一个新的数据框。
我希望得到: 第1列:平均值(V1,V2), 第2列:平均值(V3,V4), 第 3 列:平均值 (V5,V6) 等等
数据
df <- data.frame(v1=1:6,V2=7:12,V3=13:18,v4=19:24,v5=25:30,v6=31:36)
【问题讨论】:
请以可重现的格式(而不是屏幕截图)共享数据。例如,您可以使用dput
,然后将输出包含在您的帖子中。或者您可以提供生成具有代表性的示例数据的代码。
@MauritsEvers 感谢您的评论。我已经添加了所需的数据框。
【参考方案1】:
这里是基本 R 选项
n <- 2 # Mean across every n = 2 columns
do.call(cbind, lapply(seq(1, ncol(df), by = n), function(idx) rowMeans(df[c(idx, idx + 1)])))
# [,1] [,2] [,3]
#[1,] 4 16 28
#[2,] 5 17 29
#[3,] 6 18 30
#[4,] 7 19 31
#[5,] 8 20 32
#[6,] 9 21 33
这将返回 matrix
而不是 data.frame
(这在这里更有意义,因为您正在处理“全数字”数据)。
说明:这个想法是一种不重叠的滑动窗口方法。 seq(1, ncol(df), by = n)
创建列的起始索引(此处为:1、3、5)。然后我们遍历这些索引idx
并计算df[c(idx, idx + 1)]
的行均值。这将返回一个list
,然后我们将其cbind
转换为matrix
。
作为次要修改,您还可以使用正确的尺寸预定义 data.frame
,然后通过让 R 执行隐式 list
到 data.frame
类型转换来跳过 do.call(cbind, ...)
步骤。
out <- data.frame(matrix(NA, ncol = ncol(df) / 2, nrow = nrow(df)))
out[] <- lapply(seq(1, ncol(df), by = n), function(idx) rowMeans(df[c(idx, idx + 1)]))
# X1 X2 X3
#1 4 16 28
#2 5 17 29
#3 6 18 30
#4 7 19 31
#5 8 20 32
#6 9 21 33
【讨论】:
【参考方案2】:你可以试试,
dummy <- data.frame(
v1 = c(1:10),
v2 = c(1:10),
v3 = c(1:10),
v4 = c(1:10),
v5 = c(1:10),
v6 = c(1:10)
)
nvec_mean <- function(df, n)
res <- c()
m <- matrix(1:ncol(df), ncol = n, byrow = T)
if (ncol(df) %% n != 0)
stop()
for (i in 1:nrow(m))
v <- rowMeans(df[,m[i,]])
res <- cbind(res, v)
colnames(res) <- c(1:nrow(m))
res
nvec_mean(dummy,3)
1 2
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
[7,] 7 7
[8,] 8 8
[9,] 9 9
[10,] 10 10
如果您不想要rowMeans
或结果不是您想要的,请告诉我。
简单(?)版本
df <- data.frame(v1=1:6,V2=7:12,V3=13:18,v4=19:24,v5=25:30,v6=31:36)
n = 2
res <- c()
m <- matrix(1:ncol(df), ncol = 2, byrow = T)
for (i in 1:nrow(m))
v <- rowMeans(df[,m[i,]])
res <- cbind(res, v)
res
v v v
[1,] 4 16 28
[2,] 5 17 29
[3,] 6 18 30
[4,] 7 19 31
[5,] 8 20 32
[6,] 9 21 33
【讨论】:
好像太复杂了。我只想平均每 n 列。 @JuanAlmeira 我在上面添加代码以上是关于如何从df计算每n个向量的平均值的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动平均值(rolling mean)例如,计算某公司的多个店铺每N天(5天)的滚动销售额平均值