2016-02-23 6 views
1

Я хочу вставить ячейки матрицы вместе, но когда я вставляю(), он возвращает вектор. Существует ли прямая функция для того же в R?R матрицы матрицы пасты вместе

mat <- matrix(1:4,2,2) 
paste(mat,mat,sep=",") 

Я хочу, чтобы выход в

 [,1] [,2] 
[1,] 1,1 2,2 
[2,] 3,3 4,4 

ответ

4

матрица в R является только вектор с атрибутом с указанием размеров. Когда вы соедините их вместе, вы просто теряете атрибут измерения.

Так,

matrix(paste(mat,mat,sep=","),2,2) 

Или, например,

mat1 <- paste(mat,mat,sep=",") 
> mat1 
[1] "1,1" "2,2" "3,3" "4,4" 
> dim(mat1) <- c(2,2) 
> mat1 
    [,1] [,2] 
[1,] "1,1" "3,3" 
[2,] "2,2" "4,4" 

Вот только один пример того, как вы могли бы написать простую функцию, чтобы сделать это:

paste_matrix <- function(...,sep = " ",collapse = NULL){ 
    n <- max(sapply(list(...),nrow)) 
    p <- max(sapply(list(...),ncol)) 

    matrix(paste(...,sep = sep,collapse = collapse),n,p) 
} 

... но конкретная функция, которую вы хотите, будет зависеть от того, как вы хотите, чтобы справиться с более две матрицы, матрицы разных размеров или, возможно, входы, которые совершенно неприемлемы (случайные объекты, NULL и т. д.).

Эта конкретная функция перерабатывает вектор и выводит матрицу с размером, соответствующим наибольшему из различных входов.

+0

Да, я понимаю. Но хотелось бы знать, есть ли функция в R для вставки ячеек вместе, не теряя атрибут измерения. Как мы можем добавить матрицы и вычесть, не теряя атрибут размерности. – anonR

+0

@anonR Ну, мой ответ показывает, как вы напишете один, нет ...? (С некоторой проверкой на пригодность входов и размеров.) – joran

+4

@anonR - вы можете сделать 'mat [] <- paste (mat, mat, sep =", ")', но это перезаписывает исходный 'mat' –

1

Или используйте sprintf с dim<-

`dim<-`(sprintf('%d,%d', mat, mat), dim(mat)) 
#  [,1] [,2] 
#[1,] "1,1" "3,3" 
#[2,] "2,2" "4,4" 
+1

. по этим типам функций, см. этот вопрос: [\ 'levels <- \' (Что это за колдовство?] (http://stackoverflow.com/q/10449366/210673) – Aaron

Смежные вопросы