2011-11-22 77 views
3

我有一個2D應急表R;它是一個表格對象。我想通過在它的每個元素上應用一個函數來將它轉換成一個新表格。 我研究了sapply,tapply等,但它們都是針對總結/彙總數據。我寫我自己的映射功能,這樣做,這下面我重現:如何通過對R中的每個元素應用函數來將應急表映射到另一個表?

map.table = function(t,fn) 
{ 
    rows = dim(t)[1] 
    columns = dim(t)[2] 
    x = matrix(nrow=rows, ncol=columns) 

    rownames(x) = unlist(dimnames(bush.t)[1], use.names=FALSE) 
    colnames(x) = unlist(dimnames(bush.t)[2], use.names=FALSE) 
    for(row in seq(from=1, to=rows)) 
    { 
     for(column in seq(from=1, to=columns)) 
     { 
      x[row,column] = fn(t[row,column]) 
     } 
    } 
    as.table(x) 
} 

這從頭創建一個矩陣,填補了維度名稱和元素。有沒有更好的方法來做到這一點?函數/包是否已經具有這種功能?R

回答

5

你或許可以只使用apply

set.seed(21) 
x <- data.frame(a=sample(letters[1:5],20,TRUE), 
       b=sample(letters[1:5],20,TRUE)) 
y <- table(x) 
z <- as.table(apply(y, 1:2, sqrt)) 
+0

謝謝,這工作。 – ipadawan

4

你爲什麼要這麼麻煩?你應該能夠做到這一點:

fn(t) 

(。但也考慮使用不同的名稱爲您的表,因爲t是一個非常好的基礎函數名稱起初我還以爲你調換的行和列)

如果你的函數不能和​​向量一起工作,你可以說服它來做。試試這個:

vfn <- Vectorize(fn) 
t2[] <- vfn(t) 
+0

嗨,我試過你的建議,但它只返回一個帶有警告消息的單個數字,表示「條件長度> 1,只有第一個元素將被使用」。 – ipadawan

+0

我想這是因爲我試圖應用的函數具有if-else條件來確定元素的值。無條件轉換工作得很好。 – ipadawan

+0

你的錯誤消息表明你正在使用if(),但給它一個完整的向量。有可能有更好的方法來設計一個函數,以便它可以正確應用於矢量。 –

相關問題