2016-06-16 3 views
0

私は比較的新しいRです。私は動物の行動データを扱っており、個々の動物がその行動を与えられた時間枠内で変化させる回数を確立しようとしています(この場合のセッション)。私は活動が各セッションで変更された回数をカウントしたい配列の値の変化の数をカウントする

session = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2) 
activity = c("V","F","D","F","F","W","V","R","R","S","V","U","W","V","V","V","R","R","R","R") 
df = data.frame(session,activity) 

- :

私のダミーのデータセットはようです。たとえば、セッション1では8回、セッション2では5回になります。 私はrle()を使用するためにインターネット上の他の提案に従うオプションを試しましたが、ほとんどの場合、与えられた配列の異なるモダリティを集計するので、どのようにコードすることができますか?

+0

フラグ "r"を追加します。 – user31264

答えて

0

私は自分のdfの "activity"列に、文字列でありベクトルではないことを確認しなければならないことを知りました。df$activity=as.character(df$activity) 私はこの機能を行にのみ適用しました例えば、単一のセッションで、セッション1の行は:

res<-rle(df[which(df$session==1),2])#rle() function applied to the activity column of df and to the rows of the session 1 
length(res$lengths)# will give you the number of changes within a session 

は大きなデータセットに適用するのではなく、私はループ内でそれを適用することができます:

df[,2]=as.character(df[,2])# to treat session as a character 
ls.session=unique(df$session) 
nb.session=length(ls.session) 
new.df=data.frame(ls.session,rep(0,nb.session))#create an empty data.frame where we can apply the loop 
names(new.df)=c("session","nb.change") 
for(i in 1:nb.session){ 
res.rle.sess.i=rle(df[which(df$session==ls.session[i]),2]) 
nb.chang.sess.i=length(res.rle.sess.i$lengths) 
new.df[i,2]=nb.chang.sess.i 
} 
new.df 
0
change.f = function(x) c(FALSE, x[-1] != x[-length(x)]) 
aggregate(change.f(df$activity)&!change.f(df$session), by=list(df$session), FUN=sum) 

出力:

Group.1 x 
1  1 7 
2  2 4 
関連する問題