【问题标题】:Adding values of multiple data frames per a specific variable每个特定变量添加多个数据框的值
【发布时间】:2020-04-30 04:05:14
【问题描述】:

我正在尝试计算以下内容:µ+bi+bv,其中 µ = 所有分数的平均值,bi = 特定行的平均值,bv = 特定列的平均值。

矩阵是一个 15x31 矩阵。例如,如果我要尝试找到单元格 (1,1) 的值,我将如何处理。我想将第一行的平均值与第一列相加,然后添加 µ。

非常感谢任何帮助。

【问题讨论】:

  • 您可以使用dput 添加数据并显示相同的预期输出吗?
  • 我在下面的答案中添加了如何处理 NA 值

标签: r dataframe matrix


【解决方案1】:

如果mat 是你的矩阵,我想这应该给你你想要的:

mat2 <- mat
mat2[] <- colMeans(mat)[col(mat)] +  mean(mat) + rowMeans(mat)[row(mat)]

如果您有 NA 值,请在 rowMeansmean 中添加 na.rm = TRUE

使用这些数据:

mat <- matrix(1:15, ncol = 3)
mat
#     [,1] [,2] [,3]
#[1,]    1    6   11
#[2,]    2    7   12
#[3,]    3    8   13
#[4,]    4    9   14
#[5,]    5   10   15

mean(mat)
#[1] 8

rowMeans(mat)
#[1]  6  7  8  9 10

colMeans(mat)
#[1]  3  8 13

mat2[] <- colMeans(mat)[col(mat)] +  mean(mat) + rowMeans(mat)[row(mat)]
mat2

#     [,1] [,2] [,3]
#[1,]   17   22   27
#[2,]   18   23   28
#[3,]   19   24   29
#[4,]   20   25   30
#[5,]   21   26   31

我们已经计算了mat2 中的所有值,为了仅替换NA 值,我们可以对这些值进行子集化,并将它们替换为相应的平均值。

mat2[] <- colMeans(mat, na.rm = TRUE)[col(mat)] +  
             mean(mat, na.rm = TRUE) + rowMeans(mat, na.rm = TRUE)[row(mat)]

mat[is.na(mat)] <- mat2[is.na(mat)]

【讨论】:

  • 这有帮助。我试图通过这个过程基本上预测缺失值,那么我将如何使用这个公式只针对“NA”值?
  • @JamieWarren 更新了答案以仅替换 NA 值。
【解决方案2】:

您可以在行和列均值上使用outer() 并添加整体均值。

outer(rowMeans(mat), colMeans(mat), `+`) + mean(mat)

【讨论】:

    【解决方案3】:

    使用matrix() 函数和ncol()nrow()

    # Using the data Ronak Shah provided
    mat <- matrix(1:15, ncol = 3)
    
    # Solution
    mat2 <- 
      # matrix mean
      mean(mat) +
      # column means
      matrix(rep(colMeans(mat), nrow(mat)), nrow = nrow(mat), byrow = TRUE) + 
      # row means
      matrix(rep(rowMeans(mat), ncol(mat)), nrow = nrow(mat), byrow = FALSE)
    

    返回

    > mat
         [,1] [,2] [,3]
    [1,]    1    6   11
    [2,]    2    7   12
    [3,]    3    8   13
    [4,]    4    9   14
    [5,]    5   10   15
    > mat2
         [,1] [,2] [,3]
    [1,]   17   22   27
    [2,]   18   23   28
    [3,]   19   24   29
    [4,]   20   25   30
    [5,]   21   26   31
    

    mat2[1,1] 例如 = mean(mat) + colMeans(mat)[1] + rowMeans(mat)[1] = 8 + 3 + 6 = 17


    如果您想用它来替换原始矩阵中的 NA,只需将 na.rm = TRUE 添加到所有均值函数中,然后使用 is.na() 引用矩阵并进行子分配

    mat <- matrix(1:15, ncol = 3)
    mat[1,2] <- mat[4,3] <- NA
    
    # Solution
    mat2 <- 
      # matrix mean
      mean(mat, na.rm = TRUE) +
      # column means
      matrix(rep(colMeans(mat, na.rm = TRUE), nrow(mat)), nrow = nrow(mat), byrow = TRUE) + 
      # row means
      matrix(rep(rowMeans(mat, na.rm = TRUE), ncol(mat)), nrow = nrow(mat), byrow = FALSE)
    
    # Replace the NAs
    mat[is.na(mat)] <- mat2[is.na(mat)]
    

    给予

         [,1]     [,2]     [,3]
    [1,]    1 22.19231 11.00000
    [2,]    2  7.00000 12.00000
    [3,]    3  8.00000 13.00000
    [4,]    4  9.00000 26.94231
    [5,]    5 10.00000 15.00000
    

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多