0

我有一个名为 (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 x 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.

谁能帮我克服这个问题?

4

2 回答 2

3

.fun只需要一个函数;你给了它一个带有特定参数的函数,也就是函数调用的结果。你可以把它变成一个匿名函数。

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

我将匿名函数的参数从b2改为b2s; 如果没有这个改变它本来可以工作,但会更加混乱,因为b2函数内部只是原始b2.

(未经测试,因为我没有一个例子b2。)

于 2012-07-19T17:47:28.267 回答
0

谢谢,使用包reshape我能够得到与使用布赖恩方法相同的结果,这是代码:

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 变量。再次感谢你!

于 2012-07-20T01:10:46.600 回答