2016-05-28 2 views
2

У меня есть новичка вопрос:Добавить средства столбцов и строк означает матрицу в г

Example of a dataset: 
    dat = matrix(1:6,3,2) #create a dataset 
#  [,1] [,2] 
#[1,] 1 4 
#[2,] 2 5 
#[3,] 3 6 

    rmean = rowMeans(dat) # calculate the row means of dat 
#[1] 2.5 3.5 4.5 
    cmean = colMeans(dat) # calculate the colum means of dat 
#[1] 2 5 

Я хотел бы матрицу, как следующие:

 [,1] [,2] 
[1,] 5.5 11.5 
[2,] 7.5 13.5 
[3,] 9.5 15.5 

Первая строка рассчитывается как следующие:

1+rowmeans(2.5) + colmeans(2) = 5.5 
    4+rowmeans(2.5) + colmeans(5) = 11.5 

Это то, что я пробовал:

newdat = matrix(NA, 3,2) 
    for (row in 1:nrow(dat)) 
    for (col in 1:ncol(dat)) { 
    rmean = rowMeans(dat) 
    cmean = colMeans(dat) 
    newdat[row,col] = dat[row,] + rmean[row] + cmean[col] 
    } 

Любая помощь будет оценена и, пожалуйста, исправьте мой цикл.

+2

Я не вижу вычитания здесь, титул несмотря на то – Frank

+1

Другого довольно глупый вариант: 'Даты + пр (Даты, Col (Даты)) + ave (dat, row (dat)) ' – Frank

ответ

2

Существует множество функций для работы с матрицами в R; обычно это вопрос поиска того, кого вы хотите. В этом случае sweep является то, что вы хотите:

sweep(sweep(dat, 1, rowMeans(dat), `+`), 2, colMeans(dat), `+`) 
#  [,1] [,2] 
# [1,] 5.5 11.5 
# [2,] 7.5 13.5 
# [3,] 9.5 15.5 
  • Второй аргумент наценка, как apply, где 1 строки и 2 является колонки;
  • Третий - это вектор, который должен управляться поперек строки/столбца; и
  • Четвертый - операция, которая над ними работает. Вам нужно обратные ссылки около +, чтобы передать его как имя.

Выяснить, как организовать функции, может быть боль, но как только вы это сделаете, они весьма полезны. К сожалению, справочная страница для некоторых более сложных из них трудно понять, но here's some useful reading объясняет это немного лучше.


В качестве альтернативы, вы можете получить нехитрый и воспользоваться вектором переработки:

t(t(dat + rowMeans(dat)) + colMeans(dat)) 
#  [,1] [,2] 
# [1,] 5.5 11.5 
# [2,] 7.5 13.5 
# [3,] 9.5 15.5 
+2

Для метода« утилизации вторжений »я бы сделал' dat + rowMeans (dat) + colMeans (dat) [col (dat)] ' – Frank

+0

@alistaire Спасибо, но если бы мне пришлось использовать цикл (я знаю, что он не рекомендуется в R), как бы улучшить цикл for? Я делаю что-то неправильно, вы можете это исправить. Это чисто для моего понимания. Спасибо –

+0

Во-первых, не используйте петлю, если это абсолютно необходимо. Тем не менее, вам не хватает скобок и вам нужно подмножество 'dat' как' row', так и 'col' при назначении.Кроме того, вы должны рассчитать свои строки и столбцы за пределами вашего цикла, поэтому вы не будете многократно вычислять одно и то же. Все сказали: rmean <- rowMeans (dat); cmean <- colMeans (dat); newdat <- matrix (NA, 3,2); для (строка в 1: nrow (dat)) { для (col in 1: ncol (dat)) { newdat [row, col] = dat [row, col] + rmean [row] + cmean [col] }} ' – alistaire

2

Нет необходимости для цикла. Преимущество R заключается в использовании операций Matrix/Vector, чтобы сделать то, что вы пытаетесь достичь.

dat = matrix(1:6,3,2) #create a dataset 

rmean = rowMeans(dat) 
cmean = colMeans(dat) 

newdat = dat + rmean 

newdat = t(apply(newdat, 1, function(x) x + cmean)) 
+0

Спасибо, но если бы мне пришлось использовать цикл (я знаю, что это не рекомендуется в R), как бы улучшить мой цикл for? Я делаю что-то неправильно. –

3

Это может быть сделан просто воспользовавшись тем, что + действует на матрицы элемента с помощью элемента, без необходимости использовать for петли или sweep. Опирается на рециркуляцию, чтобы заполнить матрицы с помощью столбцов и строк.

dat + matrix(rowMeans(dat),3,2) + matrix(colMeans(dat),3,2, byrow = T) 
##  [,1] [,2] 
##[1,] 5.5 11.5 
##[2,] 7.5 13.5 
##[3,] 9.5 15.5 
2

Мы можем использовать функцию row и col сделать репликацию

dat+rowMeans(dat)[row(dat)] + colMeans(dat)[col(dat)] 
#  [,1] [,2] 
#[1,] 5.5 11.5 
#[2,] 7.5 13.5 
#[3,] 9.5 15.5 
Смежные вопросы