การลบแถวใน shapefile ใน R


12

ฉันได้นำเข้า shapefile ลงใน R และเข้าร่วมกับตาราง Shapefile ของฉันมีรหัสสำรวจสำมะโนประชากรทั้งหมดในขณะที่ตารางของฉันมีรหัสสำรวจสำมะโนประชากรที่เลือกไว้เท่านั้น ตอนนี้ฉันกำลังพยายามลบแถวทั้งหมดไม่ได้รับการจับคู่

นี่คือชุดข้อมูลของฉันดูเหมือน (ฉันพยายามลบแถวทั้งหมดด้วย 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" ที่มี dataframe ของคุณ

หากคุณต้องการลบแถว "ทั้งหมด" ที่มีค่า 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 นี่คือสิ่งที่น่าเสียดายที่ไม่ได้โฆษณาอย่างกว้างขวาง ในการผสานดาต้าเฟรมเข้ากับช่อง @data ของวัตถุ sp คุณสามารถใช้การจับคู่ด้วยวิธีนี้

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

ไหน; shape เป็นไฟล์รูปร่างของคุณ IDS เป็นตัวระบุที่คุณต้องการผสานและ OtherData เป็น dataframe ที่คุณต้องการรวมเข้ากับรูปร่าง โปรดทราบว่า 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 = วัตถุ dataframe ที่จะรวมกับ x, xcol = รวมชื่อคอลัมน์ในวัตถุ sp (ต้องอ้าง), ycol = รวมชื่อคอลัมน์ในวัตถุ dataframe (จำเป็นต้องพูด)

ด้วยเหตุผลบางอย่างฉันไม่สามารถแสดงความคิดเห็นใน @Kelly คำถามดังนั้นฉันกำลังแก้ไขคำตอบเดิมของฉัน ตรวจสอบว่าคุณใช้ R และ sp เวอร์ชันใดอยู่ คุณสามารถเรียกใช้ SessionInfo () เพื่อค้นหา พฤติกรรมของการลบวัตถุที่เกี่ยวข้องในช่องข้อมูลอื่นเมื่อจัดการวัตถุ @data มีให้บริการเฉพาะในรุ่น sp คู่สุดท้าย หากไม่ได้ใช้เวอร์ชันปัจจุบันให้ลองอัปเดตแพ็คเกจด้วย "อัพเดตแพ็คเกจ" ใต้เมนูแพคเกจ หากใช้งาน> = Windows Vista ต้องแน่ใจว่าได้ทำงานเป็นผู้ดูแลระบบ ดูขนาดวัตถุของคุณก่อนและหลังเช่น dim (รูปร่าง) ซึ่งแสดงถึงจำนวนแถว / cols จำนวนแถวสอดคล้องกับจำนวนของคุณสมบัติวัตถุ คุณสามารถตรวจสอบผลลัพธ์ได้ด้วยการตรวจสอบเพื่อดูว่าจำนวนแถวในวัตถุเชิงพื้นที่ตรงกับจำนวนแถวในช่อง @data เช่นสลัว (รูปร่าง) หรือไม่


ขอบคุณสำหรับความช่วยเหลือของคุณ! ฉันลดการรวมเชิงพื้นที่เพราะฉันใช้ 'รวม' แทน 'จับคู่' ฉันได้ลบแถว NA ทั้งหมดออก แต่รูปร่างยังคงปรากฏอยู่ใน shapefile เมื่อฉันลงจุด มีความคิดเห็นเกี่ยวกับสาเหตุที่เกิดขึ้นนี้ไหม
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.