【问题标题】:How to calculate the mean for every n vectors from a df如何从df计算每n个向量的平均值
【发布时间】: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 感谢您的评论。我已经添加了所需的数据框。

标签: r vector mean


【解决方案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 执行隐式 listdata.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 我在上面添加代码
    猜你喜欢
    • 2017-09-23
    • 2018-05-05
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多