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=as.character(df$activity) 문자가 아닌 벡터 것을 확인하고, 내 안양의 "활동"칼럼에 RLE를 aply했다는 것을 친구로부터 발견 예를 들어 단일 세션의 세션 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 
관련 문제