Добавление значений нескольких фреймов данных в указанную переменную c - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь вычислить следующее: µ + bi + bv, где µ = среднее по всем оценкам, bi = среднее по заданной c строке и bv = среднее по заданному c столбцу.

Матрица 15x31. Например, если бы я попытался найти значение ячейки (1,1), как бы я go об этом. Я хотел бы добавить средние значения строки один с первым столбцом, а затем добавить µ.

Любая помощь с благодарностью.

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

Вы можете использовать outer() в средстве для строки и столбца и добавить общее среднее значение.

outer(rowMeans(mat), colMeans(mat), `+`) + mean(mat)
2 голосов
/ 30 апреля 2020

Если mat ваша матрица, я думаю, это должно дать вам то, что вы хотите:

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

Добавьте na.rm = TRUE в rowMeans и mean, если у вас есть NA значения.

Используя эти данные:

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)]
1 голос
/ 30 апреля 2020

Использование функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...