2

次のようなデータフレームがあります

df<-data.frame(date=c(rep("1/27/2010",times=30)),
           loc1=c(rep(9:13,each=6)),
           loc2=c(rep(c("N","E","W"),each=2)),
           loc3=c(rep(c(1,2))),
           tr1=c(rep(c(0,1),each=15)),
           tr2=c(0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1),
           tr3=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4),
           Birth=c(sample(c("early","late"),30,replace=TRUE,prob=c(0.5,0.5))),
           Species=c(rep(c("A","B"),times=15)),
           Status=c(sample(c(0,1),30,replace=TRUE,prob=c(0.7,0.3))))

df<-rbind(df,df)

loc1、loc2、tr1、tr2、tr3、Birth、および Species で定義された行を使用して、loc3 の値ごとに個別の列を作成したいと考えています。これらの値を共有するすべての観測値のステータスを「カウント」し、そのカウントを loc3 でグループ化したいと考えています。

reshape2 パッケージの dcast を使用する予定でした。

必要な「カウント」を実行する関数を作成しました。私は R に不慣れで、これを行う関数があると確信していますが、すぐには見つけることができませんでした。タスクの単純さを考えると、自分でスクリプトを作成してみる価値のある演習のように思えました。

      d.count<-function(x){
  j=0
  for (i in 1:length(x))
    if (is.na(x{i])){
      j<-j+0
    }else if(x[i]==0){
      j<-j+1
    } else if(x[i]==1){
      j<-j+0
    }
  return(j)
}

0 はカウントを増やす必要があり、1 と NA はカウントを増やすべきではありません。

そう

df_1<-dcast(df,date+loc1+loc2+tr1+tr2+tr3+Birth+Species~loc3,value.var="Status",fun.aggregate=d.count)

エラーが発生します

Error in if (is.na(x[i])) { : argument is of length zero

これにより、dcast が fun.aggregate をどのように扱っているかを理解していないと思います...

助けてくれてありがとう!-JJE

4

1 に答える 1

2

tabulate関数を使用してこのようなことをしないのはなぜですか

require(reshape2)
dcast(df, ... ~ loc3, value.var = "Status", fun.aggregate = tabulate)

##         date loc1 loc2 tr1 tr2 tr3 Birth Species 1 2
## 1  1/27/2010    9    E   0   0   1 early       A 0 0
## 2  1/27/2010    9    E   0   0   1 early       B 0 0
## 3  1/27/2010    9    N   0   0   1 early       B 0 0
## 4  1/27/2010    9    N   0   0   1  late       A 0 0
## 5  1/27/2010    9    W   0   0   1 early       B 0 0
## 6  1/27/2010    9    W   0   0   1  late       A 0 0
## 7  1/27/2010   10    E   0   1   2  late       A 0 0
## 8  1/27/2010   10    E   0   1   2  late       B 0 2
## 9  1/27/2010   10    N   0   0   1  late       A 0 0
## 10 1/27/2010   10    N   0   1   2  late       B 0 2
## 11 1/27/2010   10    W   0   1   2  late       A 0 0
## 12 1/27/2010   10    W   0   1   2  late       B 0 0
## 13 1/27/2010   11    E   0   1   2  late       A 0 0
## 14 1/27/2010   11    E   1   0   3 early       B 0 2
## 15 1/27/2010   11    N   0   1   2 early       B 0 0
## 16 1/27/2010   11    N   0   1   2  late       A 0 0
## 17 1/27/2010   11    W   1   0   3  late       A 0 0
## 18 1/27/2010   11    W   1   0   3  late       B 0 2
## 19 1/27/2010   12    E   1   0   3 early       B 0 0
## 20 1/27/2010   12    E   1   0   3  late       A 0 0
## 21 1/27/2010   12    N   1   0   3 early       A 2 0
## 22 1/27/2010   12    N   1   0   3 early       B 0 2
## 23 1/27/2010   12    W   1   0   4 early       A 0 0
## 24 1/27/2010   12    W   1   1   4 early       B 0 0
## 25 1/27/2010   13    E   1   1   4 early       B 0 0
## 26 1/27/2010   13    E   1   1   4  late       A 0 0
## 27 1/27/2010   13    N   1   1   4  late       A 0 0
## 28 1/27/2010   13    N   1   1   4  late       B 0 2
## 29 1/27/2010   13    W   1   1   4 early       A 0 0
## 30 1/27/2010   13    W   1   1   4 early       B 0 2

編集

たとえば、0の数を数えたい場合:

dcast(df, ... ~ loc3, value.var = "Status", 
         fun.aggregate = function(x) sum(x == 0, na.rm = TRUE))
于 2013-06-18T21:12:29.270 に答える