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])))

私にとって少し奇妙なことは、このアプローチとブライアンが親切に提案したアプローチを使用して、目的のベクトルではなく新しい行列を取得したことです。

dim(x)
[1]  155 3566

したがって、行には同じ情報が含まれているため、ベクトルを取得するために最初の行をサブセット化するだけで済みました。長さ 3565 の私のベクトルは、次を使用して取得されました。

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

最初の列が b2 の id 変数を説明していることを考慮して、2 から始めました。ありがとうございました!

于 2012-07-20T01:10:46.600 に答える