自定义函数无法被ddply {plyr}识别,它告诉我我的函数不是函数

时间:2012-07-19 08:32:53

标签: r function plyr

我有一个名为(b2)的矩阵,包含3565行和125列,只有二分值(0和1)

我设计了一个比较行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.

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

.fun只需要一个函数;你给它一个具有特定参数的函数,即函数调用的结果。您可以将其转换为匿名函数。

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

我改为从b2b2s的匿名函数的参数;它会在没有这种变化的情况下发挥作用,但会更加混乱,因为函数内的b2只是原始b2的一部分。

(未经测试,因为我没有b2的示例。)

答案 1 :(得分: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变量。 再次感谢你!