R에서 shapefile에서 행 제거


12

shapefile을 R로 가져 와서 테이블에 결합했습니다. 내 shapefile에는 모든 센서스 ID가 포함되고 테이블에는 선택한 센서스 ID 만 포함됩니다. 이제 일치하지 않는 모든 행을 삭제하려고합니다.

이것은 내 데이터 세트의 모양입니다 (NA로 모든 행을 제거하려고하므로 마지막 두 행을 제거해야합니다).

  CTUID   Cluster   Average
5350007.01  1       124.53
5350007.02  1       234.87
5350010.01  4       110.11
5350010.02  5       187.68
5350001     NA        NA
5350002     NA        NA

이 라인 코드를 사용해 보았습니다.

shape2[!(rowSums(is.na(shape2))==NCOL(shape2)),]

이 오류가 발생했습니다.

Error in rowSums(is.na(shape2)) : 
  'x' must be an array of at least two dimensions
In addition: Warning message:
In is.na(shape2) : is.na() applied to non-(list or vector) of type 'S4'

나는 R에 능숙하지 않으므로 도움을 주시면 감사하겠습니다. 환상적인 설명을 포함시킬 수 있다면.

답변:


13

오류의 유익한 부분은 작업중 인 데이터가 S4 클래스 객체이며 슬롯이 포함되어 있다는 것입니다. 즉, 데이터 프레임이 포함 된 적절한 슬롯 "@data"에서 작업해야합니다.

NA 값으로 "모든"행을 삭제하려면 데이터 프레임 슬롯에서 na.omit을 사용하면됩니다. 이것은 sp 객체를 통해 전파되고 다른 슬롯에서 연관된 점 / 다각형을 제거합니다.

shape@data <- na.omit(shape@data)

특정 열에서 NA가있는 행을 제거하려면 다음을 사용할 수 있습니다.

shape@data <- shape[!is.na(shape@data$col) ,]

**** 업데이트 03/08/2016 sp 개체에서 작동하는 기본 병합 기능이 있습니다. 다른 data.frame과 동일한 방식으로 병합을 호출 할 수 있습니다. 그러나 x 인수는 sp SpatailDataFrame 클래스 객체이고 y는 병합하려는 data.frame입니다. 참고 목적으로 원래 답변을 남기고 있습니다.


또한 병합 기능을 사용하여 sp 객체에 연결할 수 없다는 점도 지적해야합니다. 병합 기능은 작업 중에 데이터를 사용하여 sp 개체의 내부 관계를 해제합니다. 불행히도, 이것은 널리 보급되지 않은 것입니다. 데이터 프레임을 sp 객체의 @data 슬롯에 병합하려면 이와 같이 match를 사용할 수 있습니다.

shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])

어디; shape는 모양 파일이고 IDS는 병합하려는 식별자이고 OtherData는 모양과 결합하려는 데이터 프레임입니다. IDS는 두 데이터 세트에서 이름이 다를 수 있지만 실제로 같은 값이어야합니다 (퍼지 아님).

또는이 기능을 사용할 수 있습니다.

join.sp.df <- function(x, y, xcol, ycol) {
  x$sort_id <- 1:nrow(as(x, "data.frame"))  
    x.dat <- as(x, "data.frame")  
     x.dat2 <- merge(x.dat, y, by.x = xcol, by.y = ycol)  
    x.dat2.ord <- x.dat2[order(x.dat2$sort_id), ]  
  x2 <- x[x$sort_id %in% x.dat2$sort_id, ]  
  x2.dat <- as(x2, "data.frame") 
    row.names(x.dat2.ord) <- row.names(x2.dat)  
  x2@data <- x.dat2.ord  
  return(x2)
}

어디; x = sp SpatialDataFrame 객체, y = x와 병합 할 데이터 프레임 객체, xcol = sp 객체의 열 이름 병합 (따옴표 필요), ycol = 데이터 프레임 객체의 열 이름 병합 (따옴표 필요)

어떤 이유로 @Kelly 질문에 댓글을 달 수 없으므로 원래 답변을 편집하고 있습니다. 실행중인 R 및 sp 버전을 확인하십시오. SessionInfo ()를 실행하여 찾을 수 있습니다. @data 객체를 조작 할 때 다른 데이터 슬롯에서 연관된 객체를 제거하는 동작은 마지막 커플 sp 버전에서만 사용할 수있었습니다. 현재 버전을 실행하지 않는 경우 패키지 메뉴에서 "패키지 업데이트"로 패키지를 업데이트하십시오. > = Windows Vista를 실행중인 경우 반드시 관리자 권한으로 실행하십시오. 또한 행 / 콜 수를 나타내는 dim (shape)과 같은 개체 전후의 차원을 살펴보십시오. 행 수는 피처 객체 수에 해당합니다. 공간 객체의 행 수가 @data 슬롯의 행 수와 일치하는지 확인하여 결과를 확인할 수 있습니다 (예 : dim (shape);


당신의 도움을 주셔서 감사합니다! 'match'대신 'merge'를 사용했기 때문에 공간 조인을 다시 사용했습니다. 모든 NA 행을 제거했지만 셰이프 파일을 플롯 할 때 셰이프는 여전히 셰이프 파일에 있습니다. 왜 이런 일이 일어나고 있는지에 대한 생각?
Kelly

이 답변에 대한 수정은 sp 1.0-15에서 필요합니다. sp 클래스 객체를 전달할 때 행 크기가 관련 슬롯과 일치하도록 일대일 일치를 수행하면 올바르게 수행되는 sp 특정 버전의 병합 함수가 호출됩니다.
Jeffrey Evans

7

패키지의 업데이트로 다음을 제안합니다.

shape <- shape[!is.na(shape@data$col),]

과거 버전에서는 "모양"이 data.frame으로 강제 변환되었습니다. sp 개발자가 일부 표준 R 메서드를 sp ​​개체에서 작동하게 만들기 시작했습니다. 이 업데이트를 제공해 주셔서 감사합니다.
Jeffrey Evans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.