2012-07-19 85 views
0

我有一個名爲包含3565行和125列,只有兩分的值(0和1)自定義功能,它告訴我,我的函數不是一個函數

(B2)矩陣

我設計了一個功能比較行i和行i+1並存儲在一個新的矢量差數。

loopPhudcf <- function(x){ 
    ## create a vector to store the results of your for loop 
    output <- as.vector(rep(0, length(x[,1]))) 
    for (i in 1:(nrow(x))-1) { 
    output[i]<-as.vector(table(x[i,]==x[i+1,]))[1] 
    } 
    a<-nrow(x) 
    b<-nrow(x)-1 
    output<-t(as.matrix(output[c(a,1:b)])) 
    output[output==ncol(x)]<-0 
    return(output) 
} 

phudcfily123<-loopPhudcf(b2) 

功能工作正常,但我也有我使用添加到我原來的矩陣的ID變量:b2<-transform(b2,id=a$id),然後導致3565由126是最後一個id變量

我想使用ddply {} plyr申請我的功能,但要做到這一點,我需要子集只是我的原始矩陣無ID變量(as.matrix(b2[,1:(ncol(b2)-1)])),但它口口聲聲說我的函數不是一個函數:(

x <- ddply(.data = b2, .var = c("id"), .fun = loopPhudcf(as.matrix(b2[,1:(ncol(b2)-1)]))) 

Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress, : 
    .fun is not a function. 

任何人都可以幫助我克服這個問題問題?

回答

0

謝謝 使用包reshape我能得到相同的結果使用Brian的方法來實現,這是代碼:

x<-sparseby(as.matrix(b2[,1:125]),list(group = b2[,126]), function(subset) loopPhudcf(as.matrix(b2[,1:125]))) 

的東西一點點奇怪,我的是,使用這種方法和方式由Brian好心建議我得到的,而不是我所希望的矢量的新矩陣

dim(x) 
[1] 155 3566 

所以,我只需要對第一行進行子集化即可獲得矢量,因爲這些行包含相同的信息。使用得到我的具有3565的長度矢量:

x1<-x[1,2:ncol(x)] 

我開始與2中給出的是第一列佔在B2 id變量。 再次感謝您!

3

.fun只是一個函數;你已經給它一個帶有特定參數的函數,也就是函數調用的結果。你可以把它變成一個匿名函數。

x <- ddply(.data = b2, .var = c("id"), .fun = function(b2s) {loopPhudcf(as.matrix(b2[,1:(ncol(b2)-1)]))} 

餘改變爲從b2b2s匿名函數的參數;它會在沒有這種改變的情況下工作,但會更加令人困惑,因爲函數內部的b2只是原始的b2的子集。

(未經測試,因爲我沒有的b2一個例子)

+0

輝煌!!!謝謝布萊恩,它工作完美。我還用另一種方式達到了預期的效果,我將在下面展示!再次感謝你! – 2012-07-20 00:59:58

相關問題