2016-08-30 78 views
1

假設有一個矩陣(X)和第二矩陣(src)使得X rownames是src的rownames和X的colnames的一個子集是src的colnames的子集。創建一個行和列爲src,數據爲X,缺失數據填入某個默認值(如零或NA)的矩陣的最佳方法是什麼?如何使用命名行和列填充矩陣?

下面是我的嘗試,但我覺得必須有R.

# Assume row and columns are named 
PadColumns <- function(x, src, fill = NA) { 
    # pad columns with default values 
    result <- matrix(fill, nrow = nrow(x), ncol = ncol(src)) 
    colnames(result) <- colnames(src) 
    rownames(result) <- rownames(x) 
    result[,match(colnames(x), colnames(src))] <- x 
    result 
} 

PadRows <- function(x, src, fill = NA) { 
    # pad rows with default values 
    result <- matrix(fill, nrow = nrow(src), ncol = ncol(x)) 
    colnames(result) <- colnames(x) 
    rownames(result) <- rownames(src) 
    result[match(rownames(x), rownames(src)),] <- x 
    result 
} 

PadRowsColumns <- function(x, src, fill = NA) { 
    PadColumns(PadRows(x, src, fill = fill), src, fill = fill) 
} 

例如這樣的標準方法,給出

X <- matrix(1:6, nrow = 2, dimnames = list(letters[2 * 1:2], LETTERS[2 * 1:3])) 
src <- matrix(0, nrow = 4, ncol = 6, dimnames = list(letters[1:4], LETTERS[1:6])) 

那麼我們應該得到這樣的:

> X 
    B D F 
b 1 3 5 
d 2 4 6 
> PadRowsColumns(X, src) 
    A B C D E F 
a NA NA NA NA NA NA 
b NA 1 NA 3 NA 5 
c NA NA NA NA NA NA 
d NA 2 NA 4 NA 6 
+0

@JasonAizkalns好點。完成。 – banbh

回答

2

您可以通過行和列的名稱子集矩陣。

src <- matrix(1, nrow = 3, ncol = 4, 
       dimnames= list(c("a", "b", "c"), c("A", "B", "C", "D"))) 
X <- matrix(1:6, nrow = 2, ncol = 3, 
      dimnames = list(c("b", "c"), c("A", "C", "D"))) 
Y <- src 
Y[] <- NA 
Y[rownames(X), colnames(X)] <- X 
+0

杜!我知道必須有比我的代碼更簡單的東西。謝謝! – banbh