การรวมคะแนนกับกริดโดยใช้ R


14

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

จุดได้เปรียบของฉันคือชุดข้อมูลที่มีข้อมูลอ้างอิงทางภูมิศาสตร์สำหรับเหตุการณ์ความขัดแย้งในแอฟริกา (ดู www.acleddata.com) คะแนนจะถูกอ้างอิงทางภูมิศาสตร์ด้วยพิกัดละติจูด / ลองจิจูดและมีข้อมูลเกี่ยวกับประเภทและเวลาของเหตุการณ์ สิ่งที่ฉันต้องการทำคือรวมคะแนนเหล่านี้เข้ากับกริด 1x1 องศา

ดังนั้นกริดเซลล์ควรมีข้อมูลของจุดข้อมูลถ้ามีเหตุการณ์เกิดขึ้นภายในกริดเซลล์นั้น ผลิตภัณฑ์สุดท้ายนี้ควรเป็น data frame หรือบางสิ่งที่ฉันสามารถส่งออกไปยัง csv-file ได้เนื่องจากข้อมูลนั้นมีวัตถุประสงค์เพื่อใช้ในชุด data panel สำหรับการวิเคราะห์ทางสถิติ

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

รหัสฉันใช้เพื่อให้ห่างไกลสามารถพบได้ที่นี่กับผลภาพที่สอดคล้องกันมากกว่ามี

ข้อเสนอแนะสำหรับการทำเช่นนี้ใน QGIS ก็ยินดีต้อนรับเช่นกัน


นี่เป็นการดำเนินการอย่างง่าย ๆ ที่รวดเร็วซึ่งไม่ต้องการอะไรมากไปกว่าการคำนวณทางคณิตศาสตร์ แต่คุณต้องการเอาท์พุทรูปแบบใด "CSV" แนะนำเพียงว่าควรเป็นตารางเชิงสัมพันธ์ แต่สิ่งนี้นำเสนอปัญหา: เมื่อคุณรวมแต่ละเซลล์จะสอดคล้องกับจำนวนคะแนนที่แตกต่างกัน โดยปกติแล้วคุณจะเลือกหนึ่งในสองตัวเลือก: คุณส่งออกหนึ่งระเบียนต่อจุด (รวมถึง ID ของเซลล์ที่มี) หรือคุณส่งออกหนึ่งระเบียนต่อเซลล์และรวมถึงสรุปทางสถิติบางประการของคะแนนที่มี คุณต้องการอะไร
whuber

1
ขอโทษฉันไม่ได้ระบุว่า สิ่งที่ฉันต้องการเป็นหนึ่งในบันทึกต่อเซลล์ ฉันใช้ไฟล์ csv เพื่อสร้างข้อมูลพาเนลในรูปแบบเซลล์ปี
horseoftheyear

คำตอบ:


13

ข้อมูลที่ดาวน์โหลดมีข้อผิดพลาดเกี่ยวกับตำแหน่งที่ตรงไปตรงมาดังนั้นสิ่งแรกที่ต้องทำคือ จำกัด พิกัดไว้ที่ค่าที่เหมาะสม:

data.df <- read.csv("f:/temp/All_Africa_1997-2011.csv", header=TRUE, sep=",",row.names=NULL)
data.df <- subset(data.df, subset=(LONGITUDE >= -180 & LATITUDE >= -90))

การคำนวณพิกัดและตัวระบุเซลล์กริดเป็นเพียงเรื่องของการตัดทอนทศนิยมจากค่าละติจูดและลองจิจูด (โดยทั่วไปสำหรับ rasters ตามอำเภอใจอันดับแรกและปรับให้เป็นหน่วยเซลลูไลซ์ตัดส่วนทศนิยมแล้ว rescale และ recenter กลับไปที่ตำแหน่งเดิมดังที่แสดงในรหัสjiด้านล่าง) เราสามารถรวมพิกัดเหล่านี้เป็นตัวระบุเฉพาะ แนบไปกับ input dataframe และเขียนเพิ่ม dataframe ออกเป็นไฟล์ CSV จะมีหนึ่งระเบียนต่อจุด:

ji <- function(xy, origin=c(0,0), cellsize=c(1,1)) {
  t(apply(xy, 1, function(z) cellsize/2+origin+cellsize*(floor((z - origin)/cellsize))))
}
JI <- ji(cbind(data.df$LONGITUDE, data.df$LATITUDE))
data.df$X <- JI[, 1]
data.df$Y <- JI[, 2]
data.df$Cell <- paste(data.df$X, data.df$Y)

คุณอาจต้องการให้เอาต์พุตที่สรุปเหตุการณ์ภายในแต่ละกริดเซลล์ เพื่อแสดงสิ่งนี้ลองคำนวณจำนวนต่อเซลล์และส่งออกหนึ่งระเบียนต่อเซลล์:

counts <- by(data.df, data.df$Cell, function(d) c(d$X[1], d$Y[1], nrow(d)))
counts.m <- matrix(unlist(counts), nrow=3)
rownames(counts.m) <- c("X", "Y", "Count")
write.csv(as.data.frame(t(counts.m)), "f:/temp/grid.csv")

สำหรับบทสรุปอื่น ๆ เปลี่ยนข้อโต้แย้งในการคำนวณของfunction counts(หรือมิฉะนั้นให้ใช้สเปรดชีตหรือซอฟต์แวร์ฐานข้อมูลเพื่อสรุปไฟล์เอาต์พุตแรกโดยตัวระบุเซลล์)

เป็นการตรวจสอบมาแมปจำนวนด้วยศูนย์กริดเพื่อค้นหาสัญลักษณ์แผนที่ (จุดที่ตั้งอยู่ในทะเลเมดิเตอร์เรเนียนยุโรปและมหาสมุทรแอตแลนติกมีสถานที่ตั้งน่าสงสัย: ฉันสงสัยว่าหลายคนเป็นผลมาจากการรวมละติจูดและลองจิจูดในกระบวนการป้อนข้อมูล)

count.max <- max(counts.m["Count",])
colors = sapply(counts.m["Count",], function(n) hsv(sqrt(n/count.max), .7, .7, .5))
plot(counts.m["X",] + 1/2, counts.m["Y",] + 1/2, cex=sqrt(counts.m["Count",]/100),
     pch = 19, col=colors,
     xlab="Longitude of cell center", ylab="Latitude of cell center",
     main="Event counts within one-degree grid cells")

แผนที่แอฟริกา

เวิร์กโฟลว์นี้อยู่ในขณะนี้

  • จัดทำเอกสารอย่างละเอียด (โดยใช้Rรหัส)

  • ทำซ้ำได้ (โดยเรียกรหัสนี้ซ้ำ)

  • Extensible (โดยการแก้ไขโค้ดในรูปแบบที่ชัดเจน) และ

  • เร็วพอสมควร (การดำเนินการทั้งหมดใช้เวลาน้อยกว่า 10 วินาทีในการประมวลผลการสำรวจ 53052 เหล่านี้)


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

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

1
อาโอเค. ฉันเห็นสิ่งที่คุณหมายถึง ต้องสร้างกริดสำหรับเซลล์ทั้งหมดและรวมเท่านั้น ขอบคุณสำหรับความช่วยเหลือ
horseoftheyear

3

สิ่งที่คุณต้องการคือพื้นฐานที่เรียกว่า "Spatial Join" ซึ่งจับคู่กับสองไฟล์สองไฟล์ต่อกันและจัดสรรผลรวม (จำนวนนับ) ให้กับตารางแอตทริบิวต์ หากคุณค้นหา "Spatial Join in R" คุณจะพบตัวอย่างมากมายที่ GIS.Stackexchange ฉัน googled อย่างรวดเร็วและพบเช่นรหัสนี้โพสต์ในรายชื่อผู้รับจดหมาย

หากคุณต้องการที่จะบรรลุคุณลักษณะเชิงพื้นที่เข้าร่วมใน QGIS ให้ทำดังต่อไปนี้:

  • บันทึกรูปร่างของคุณเป็นไฟล์. shp (คำสั่งwriteOGRจากแพ็คเกจ rgdal)
  • โหลดไว้ใน QGIS สร้างกริดเวกเตอร์ของคุณใหม่ผ่านปลั๊กอิน MMQGIS (สร้าง -> สร้างเลเยอร์กริด) ด้วยการปรับสเกลที่เหมาะสม
  • ใช้เครื่องมือ "เข้าร่วมคุณสมบัติ" จากเมนู Vector -> การจัดการข้อมูล เลือกแอททริบิวต์ของเลเยอร์จุดของคุณ (ซึ่งอาจเป็นคอลัมน์แบบง่ายที่แสดงถึงค่า TRUE (1) หรือ FALSE (0) สำหรับเหตุการณ์ความขัดแย้งที่แตกต่างกัน)
  • เลือกกริดของคุณและหาผลรวมทั้งหมดที่เกิดขึ้นและดำเนินการ หลังจากนั้นฉันจะตัดกริดของคุณด้วยรูปร่างของทวีปแอฟริกา

หากการเข้าร่วมล้มเหลว (ไม่เหมาะกับฉันทุกครั้ง) ให้ติด SEXTANTE แล้วมองหากล่องเครื่องมือ SAGA ซึ่งมีฟังก์ชั่นการเข้าร่วมที่ดีมาก


แม้ว่านี่จะเป็นวิธีการแก้ปัญหาก็มีความซับซ้อนและไม่มีประสิทธิภาพโดยเฉพาะอย่างยิ่งคนหนึ่งที่ได้รับการสรุปคะแนนในตารางเป็นเพียงเรื่องของการดำเนินการทางคณิตศาสตร์ง่ายๆซึ่งRexcels ที่ การใช้ shapefiles,, rgdalQGIS และ Sextante เป็นเหมือนการแนะนำว่ามีคนจ้างโรงงานอุตสาหกรรมอัตโนมัติที่ทันสมัยเพื่อตอกตะปูสองแผงไว้ด้วยกัน :-)
whuber

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

@whuber: นั่นเป็นเรื่องจริง แต่ถ้าคุณต้องการกระจายและอาจจัดรูปแบบผลลัพธ์ของคุณแล้วไฟล์รูปร่างเป็นตัวเลือกที่ชัดเจน อย่างไรก็ตามตัวอย่าง R ที่ดี!
Curlew

ในที่สุดฉันก็ลองมัน แต่ปัญหาของวิธีนี้ก็คือการรวมการสังเกตทั้งหมดไปยังรูปหลายเหลี่ยม ในขณะที่ฉันต้องการเก็บข้อมูลเกี่ยวกับเหตุการณ์ต่าง ๆ ในช่วงเวลา แต่อาจเป็นไปได้ว่าฉันทำอะไรผิดไป
horseoftheyear
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.