2012-07-19 77 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

相关问题