จะแนบ data.frame อย่างง่ายกับ SpatialPolygonDataFrame ใน R ได้อย่างไร

ฉันมีปัญหา (อีกครั้ง) เกี่ยวกับการรวมเฟรมข้อมูลใน R แต่คราวนี้ อันหนึ่งคือ SpatialPolygonDataFrame (SPDF) และอีกอันคือ data.frame ปกติ (DF) SPDF มีประมาณ 1,000 แถว DF มีเพียง 400 แถว ทั้งสองมีคอลัมน์ทั่วไป QDGC

ตอนนี้ฉันพยายามแล้ว

oo <- merge(SPDF,DF, by="QDGC", all=T)

แต่ผลลัพธ์ที่ได้จะเป็น data.frame ปกติเท่านั้น ไม่ใช่ data frame รูปหลายเหลี่ยมเชิงพื้นที่อีกต่อไป ฉันอ่านเจอที่อื่นว่าวิธีนี้ใช้ไม่ได้ แต่ฉันไม่เข้าใจว่าต้องทำอย่างไรในกรณีเช่นนี้ (ต้องทำอะไรบางอย่างกับคอลัมน์ ID รวมการใช้งาน)

โอ้ เป็นคำถามที่ยากมาก ฉันขอ...

ขอบคุณ! เจนส์


person Jens    schedule 06.09.2010    source แหล่งที่มา


คำตอบ (6)


ให้ df = data frame, sp = วัตถุรูปหลายเหลี่ยมเชิงพื้นที่ และโดย = ชื่อหรือหมายเลขคอลัมน์ของคอลัมน์ทั่วไป จากนั้นคุณสามารถรวม data frame เข้ากับ sp object ได้โดยใช้โค้ดบรรทัดต่อไปนี้

sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])

นี่คือวิธีการทำงานของโค้ด ฟังก์ชันการจับคู่ภายในจะจัดแนวคอลัมน์เพื่อรักษาลำดับไว้ ดังนั้นเมื่อเรารวมมันเข้ากับ sp@data ลำดับจะถูกรักษาไว้อย่างถูกต้อง การตรวจสอบอย่างรวดเร็วเพื่อดูว่าโค้ดใช้งานได้หรือไม่คือการตรวจสอบทั้งสองคอลัมน์ที่สอดคล้องกับคอลัมน์ทั่วไปและดูว่ามันเหมือนกันหรือไม่ (คอลัมน์ทั่วไปมีการทำซ้ำและง่ายต่อการลบสำเนา แต่ฉันเก็บไว้เหมือนเดิม เช็คดีๆ)

person Ramnath    schedule 06.09.2010
comment
ขอบคุณมากนะ! คุณช่วยตอนเย็นของฉัน! และอาจจะทั้งสัปดาห์ด้วย! มันทำงานได้ดีอย่างสมบูรณ์แบบ - person Jens; 06.09.2010
comment
@Ramnath โซลูชันนี้จะใช้งานได้หรือไม่หากกรอบข้อมูลเชิงพื้นที่มีแถว (รูปหลายเหลี่ยม) มากกว่าข้อมูลที่ผสาน และในกรณีตรงกันข้าม - เมื่อใดที่มีการสังเกตเพิ่มเติมในข้อมูลที่รวมเข้าด้วยกัน - person radek; 13.04.2013
comment
สิ่งนี้จะแตกต่างอย่างไรหากวัตถุทั้งสองเป็น SpatialP*DataFrames - person gregmacfarlane; 24.08.2013
comment
ฉันคิดว่าคุณสามารถลองแทนที่ df ด้วย df@data[,by] ได้ ถ้า df ก็เป็น SpatialP*DataFrame เช่นกัน - person Ramnath; 24.08.2013

มันง่ายอย่างนี้:

require(sp) # the trick is that this package must be loaded!

oo <- merge(SPDF,DF, by="QDGC")

ฉันทดสอบด้วยตัวเองแล้ว แต่จะใช้งานได้ก็ต่อเมื่อคุณใช้ merge from package sp นี่เป็นค่าเริ่มต้นเมื่อโหลดแพ็คเกจ sp ฟังก์ชัน merge จะถูกโอเวอร์โหลด และใช้ sp::merge หากอาร์กิวเมนต์แรกเป็นโครงสร้างเชิงพื้นที่

person Tomas    schedule 13.11.2014
comment
มันได้ผลดีสำหรับฉันจริงๆ! อย่างไรก็ตาม ฉันคิดว่าควรชี้ให้เห็นว่าปัญหาบางอย่างอาจปรากฏขึ้นหาก dataframe และ SPDF มีจำนวนแถวไม่เท่ากัน ฉันยังคงได้รับข้อผิดพลาด (จำนวนวัตถุที่ไม่ตรงกัน) ที่เกิดจากปัญหานี้ ในที่สุด ฉันสามารถทำการผสานได้โดยการเพิ่ม all.x = TRUE (โดยที่ x คือ SPDF) - person Javier Fajardo; 01.11.2017

การผสานสามารถสร้างดาต้าเฟรมที่มีแถวมากกว่าต้นฉบับได้หากไม่มีการแมป 1-1 อย่างง่ายของทั้งสองดาต้าเฟรม ในกรณีนี้ จะต้องคัดลอกเรขาคณิตทั้งหมดและสร้างรูปหลายเหลี่ยมหลายอัน ซึ่งอาจไม่ใช่เรื่องดี

หากคุณมี dataframe ซึ่งมีจำนวนแถวเท่ากันกับ SpatialPointsDataFrame คุณสามารถแทนที่ช่อง @data ได้โดยตรง

library(sp)
example(overlay) # to get the srdf object
srdf@data
spplot(srdf)
srdf@data=data.frame(x=runif(3),xx=rep(0,3))
spplot(srdf)

หากคุณนับจำนวนแถวผิด:

srdf@data=data.frame(x=runif(2),xx=rep(0,2))
spplot(srdf)
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 3, 2
person Spacedman    schedule 06.09.2010
comment
โอเค ฉันทำสิ่งต่อไปนี้แล้ว: (1) oo ‹- merge(SPDF,DF, by=QDGC, all=T) (2) SPDF@data ‹- oo (3) plot(SPDF) ข้อมูลมีอยู่ในขณะนี้ แต่ในมาก คำสั่งผิด บางทีฉันควรจะเรียงลำดับอะไรบางอย่าง? - person Jens; 06.09.2010
comment
อุ๊ย ฉันควรจะตรวจสอบสิ่งนั้นแล้ว - person Spacedman; 06.09.2010

บางทีฟังก์ชัน joinCountryData2Map ในแพ็คเกจ rworldmap อาจเป็นแรงบันดาลใจได้ (แต่ผมอาจจะผิดเหมือนครั้งที่แล้วนะครับ)

person Karsten W.    schedule 06.09.2010

อีกวิธีหนึ่งคือการใช้ฟังก์ชัน append_data จากแพ็คเกจ tmaptools . มันถูกเรียกด้วยข้อโต้แย้งเหล่านี้:

append_data(shp, data, key.shp = NULL, key.data = NULL,
  ignore.duplicates = FALSE, ignore.na = FALSE,
  fixed.order = is.null(key.data) && is.null(key.shp))

น่าเสียดายที่มันถูกเรียกว่า append เนื่องจากฉันเข้าใจว่าการผนวกมากกว่านั้นมีความหมายว่า rbind และเราต้องการมีบางอย่างเช่น join หรือ merge ที่นี่

หากเพิกเฉยต่อข้อเท็จจริงดังกล่าว ฟังก์ชันจะมีประโยชน์มากในการทำให้แน่ใจว่าคุณได้การรวมที่ถูกต้อง และหากมีบางแถวปรากฏเพียงด้านเดียวของการรวม จากเอกสาร:

ภายใต้ความครอบคลุม (รายการรูปร่างที่ไม่สอดคล้องกับบันทึกข้อมูล) ความครอบคลุมมากเกินไป (บันทึกข้อมูลที่ไม่สอดคล้องกับรายการรูปร่างตามลำดับ) รวมถึงการมีอยู่ของค่าคีย์ที่ซ้ำกันจะถูกตรวจสอบและรายงานโดยอัตโนมัติผ่านข้อความคอนโซล ด้วย under_coverage และ over_coverage ค่าคีย์ความครอบคลุมด้านล่างและด้านบนจากการเรียก append_data ครั้งล่าสุดสามารถดึงข้อมูลได้

person radek    schedule 02.02.2018

หากเป็นเชปไฟล์สองไฟล์ที่จำเป็นต้องรวมเป็นออบเจ็กต์เดียว ให้ใช้ rbind()

เมื่อใช้ rbind() โปรดตรวจสอบให้แน่ใจว่าอาร์กิวเมนต์ทั้งสองที่คุณใช้คือ SpatialDataFrames คุณสามารถตรวจสอบได้โดยใช้ class(sf) หากไม่ใช่ dataframe ให้ใช้ st_as_sf() เพื่อแปลงเป็น SpatialDataFrame ก่อนที่จะทำการ rbind

หมายเหตุ : คุณยังสามารถใช้สิ่งนี้เพื่อต่อท้าย NULLs ได้ โดยเฉพาะเมื่อคุณใช้ผลลัพธ์จากการวนซ้ำและต้องการสะสมผลลัพธ์

person Jerin Mathew    schedule 05.07.2021