2014-03-03 5 views
1

차량 ID가 시간이 지남에 따라 반복되는 데이터 세트로 작업하고 있습니다. 단일 차량의 예는 무엇인가 다음과 같다 : "."ddply에서 변환을 사용하여 새 열 추가 R

df <- data.frame(veh = rep(2,15), lane=c(rep(3,5), rep(4,5), rep(5,5)), frame=1:15) 

내가하는 '예'레인에 변화가 있음을 의미 새 열을 추가하고 싶었 차선 변경이 없음을 의미합니다. 나는 아래와 같이 ddply를 사용했다.

> ddply(df, 'veh', transform,change=c(NA,ifelse(diff(df$lane)!=0,"yes","."))) 
    veh lane frame change 
1 2 3  1 <NA> 
2 2 3  2  . 
3 2 3  3  . 
4 2 3  4  . 
5 2 3  5  . 
6 2 4  6 yes 
7 2 4  7  . 
8 2 4  8  . 
9 2 4  9  . 
10 2 4 10  . 
11 2 5 11 yes 
12 2 5 12  . 
13 2 5 13  . 
14 2 5 14  . 
15 2 5 15  . 

이렇게하면 원하는 출력을 얻을 수있다. 그러나 원래 데이터 세트에는 더 많은 차량 ID (df에 'veh')가 있습니다. 'HV은'이름임을

> hv1 <- ddply(hv, 'Vehicle.ID', transform,change=c(NA,ifelse(diff(hv$Lane)!=0,"yes","."))) 
Error in data.frame(list(Vehicle.ID = c(14L, 14L, 14L, 14L, 14L, 14L, : 
    arguments imply differing number of rows: 455, 23454 

주 : 제 1 차량 ID '14'I 원본 데이터 세트에 대해 동일한 기능을 사용하는 경우 I 오류 다음 얻을 23454.되고 455 번 행의 총 수를 반복 내 원래 데이터 세트. 코드에서 문제를 지적 해 주시겠습니까?

+0

이'HV의 $'제거; 그렇지 않으면'transform'은'ddply'에 의해 첫번째 인자로 주어지는 조각 대신에 데이터 프레임에서 전체 컬럼을 삽입하려고합니다. – BrodieG

+0

@ BrodieG 감사합니다! hv $를 제거하면 문제가 해결되었습니다. –

답변

2

간단한 벡터 문제이므로 ddply은 필요하지 않습니다. diff 간단한 색인을 사용해보십시오 :

do.call('rbind', lapply(split(df, df$veh), function(z){ 
    z$change <- c(NA, diff(z$lane)) 
    z$change[z$change==1]<-'yes' 
    z$change[z$change==0]<-'.' 
})) 

결과 :

> df 
    veh lane frame change 
1 2 3  1 <NA> 
2 2 3  2  . 
3 2 3  3  . 
4 2 3  4  . 
5 2 3  5  . 
6 2 4  6 yes 
7 2 4  7  . 
8 2 4  8  . 
9 2 4  9  . 
10 2 4 10  . 
11 2 5 11 yes 
12 2 5 12  . 
13 2 5 13  . 
14 2 5 14  . 
15 2 5 15  . 
+0

나는 여러 자동차가 있다는 것에 문제가 있다고 생각한다. 차로 쪼개어 야한다. (여기에는'ave'가있다. 여기에는 plyr/data.table/dplyr 꾸러미가있다.) 나는 오해 할 수있다. +1 어쨌든 당신을 10K로 데려다 줄 것입니다.) – BrodieG

+0

여러 자동차로 인해 나는 쪼갤 필요가 있었고 그 이유는 ddply였습니다. 어쨌든 고마워. –

+0

의미가 있습니다. 편집을 참조하십시오. – Thomas