2014-04-09 7 views
2

나는 토지 이용에 관한 자료를 가지고 있으며, 목초지에서 경작지로 변경된 관찰 (작은 토지)이 있는지 여부를 반환하는 논리 함수를 작성하려고합니다. 농경지에 묵었습니다. 아래는 내 데이터 프레임의 작은 샘플입니다.시간의 경과에 따른 요인의 변화 R

crop2 <- read.table(text=" 
OBS   2003  2004  2005  2006  2007  2008  changes 
494136 Grassland Grassland Grassland Developed Cropland Grassland  2 
825726 Developed Developed Developed Grassland Grassland Grassland  1 
500019 Forest Forest Forest Forest Forest Grassland  1 
587587 Cropland Cropland Cropland Cropland Cropland Cropland  0 
524302 Grassland Grassland Cropland Cropland Cropland Cropland  1 
158075 Cropland Cropland Cropland Cropland Cropland Cropland  0 
",header=TRUE,check.names=FALSE) 

이 데이터 샘플에서 함수는 참으로 두 번째에서 마지막 관찰까지만 반환합니다. 나는 다양한 함수와 if 문을 사용해 보았지만 올바른 코딩을 얻을 수 없다. (부분적으로 농경지에서 초원으로의 전환이 일어날 수 있기 때문에 부분적으로 발생했다. 변경이 발생하면 찾기 위해이 함수를 작성할 수 있었다.) 변경 사항이 발생하는지 여부보다 더 많은 정보를 추출해야합니다. 길이 (unique (as.character (crop2 [x,]))

내 데이터 프레임의 이름은 crop2이며 각 열의 이름은 연도로 지정됩니다. 변수는 5 단계로 요소이다 덕분에 당신이 도움을

답변

2

rle 사용 :..

apply(
    crop2[2:7], 
    1, 
    function(x) all(tail(rle(x)$values,2) == c("Grassland","Cropland")) 
) 
#[1] FALSE FALSE FALSE FALSE TRUE FALSE 

함수는 crop2[2:7]으로 정의 된 연간 데이터의 각 행 (MARGIN=1)에 걸쳐 apply입니다.

rle(x)$values은 토지 이용 변화의 순서를 반환합니다. 5 행은 다음

#  2004  2008 
#"Grassland" "Cropland" 

all(... = c("Grassland","Cropland")) 비트 단지 여부 테스트 : tail(...,2)이 포장

#  2004  2008 
#"Grassland" "Cropland" 

다만 이때 다시 똑같이 데이터이다 마지막 2 개 용도의 변화를 준다 토지 이용은 "Grassland" (TRUE

)에서 직접 나온 후 "Cropland"으로 끝납니다.