आर में शेपफाइल में पंक्तियों को हटाते हुए


12

मैंने आर में एक आकार का आयात किया है, और इसे एक तालिका में शामिल कर लिया है। मेरी आकृति में सभी जनगणना आईडी हैं, जबकि मेरी तालिका में केवल चयनित जनगणना आईडी हैं। मैं अब उन सभी पंक्तियों को हटाने की कोशिश कर रहा हूँ जिन्हें एक मैच नहीं मिला।

यह वही है जो मेरा डेटासेट दिखता है (मैं 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'

मैं आर में बहुत कुशल नहीं हूँ, इसलिए किसी भी मदद वास्तव में सराहना की जाएगी। यदि आप एक संक्षिप्त विवरण शामिल कर सकते हैं जो शानदार होगा।

जवाबों:


13

त्रुटि का सूचनात्मक हिस्सा यह है कि आप जिस डेटा पर काम कर रहे हैं वह एक एस 4 क्लास ऑब्जेक्ट है और जैसे कि स्लॉट्स हैं। इसका मतलब है कि आपको अपने डेटाफ़्रेम वाले उपयुक्त स्लॉट "@ डाटा" पर काम करना होगा।

यदि आप NA मानों के साथ "सभी" पंक्तियों को हटाना चाहते हैं तो आप डेटाफ्रेम स्लॉट पर सिर्फ na.omit का उपयोग कर सकते हैं। यह sp ऑब्जेक्ट के माध्यम से प्रोपेगेट करता है और अन्य स्लॉट्स में संबंधित बिंदुओं / बहुभुजों को हटाता है।

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

यदि आप NA के साथ पंक्तियों को हटाना चाहते हैं, तो आप एक विशिष्ट कॉलम का उपयोग कर सकते हैं:

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

**** अद्यतन 03/08/2016 अब एक देशी मर्ज फ़ंक्शन है जो sp ऑब्जेक्ट्स पर काम करता है। आप मर्ज को उसी तरह से कॉल कर सकते हैं जैसे आप किसी अन्य डेटा.फ्रेम के साथ करते हैं। हालाँकि x तर्क एक Sp SpailailDataFrame वर्ग ऑब्जेक्ट है और y कोई भी डेटा है। आप मर्ज करना चाहते हैं। मैं संदर्भ उद्देश्यों के लिए मूल उत्तर छोड़ रहा हूं।


मुझे यह भी इंगित करना चाहिए कि आप किसी ऑब्जेक्ट में शामिल होने के लिए मर्ज फ़ंक्शन का उपयोग नहीं कर सकते हैं। मर्ज फ़ंक्शन ऑपरेशन के दौरान डेटा को रीसेट करता है जो कि स्पॉन ऑब्जेक्ट में आंतरिक संबंध को तोड़ता है। यह कुछ ऐसा है जो दुर्भाग्य से, व्यापक रूप से विज्ञापित नहीं है। किसी sp ऑब्जेक्ट के @data स्लॉट में डेटाफ़्रेम मर्ज करने के लिए आप इस तरह से मैच का उपयोग कर सकते हैं।

shape@data = data.frame(shape@data, OtherData[match(sdata@data$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 के साथ मर्ज करने के लिए x, xcol = मेर कॉलम कॉलम नेम ऑब्जेक्ट में (कोट करने की जरूरत है), ycol = डेटाफ्रेम ऑब्जेक्ट में कॉलम का नाम (क्विट करने की जरूरत है)।

किसी कारण से मैं @ केली प्रश्न पर टिप्पणी नहीं कर सकता, इसलिए मैं अपना मूल उत्तर संपादित कर रहा हूं। जांचें कि आप R और Sp का कौन सा संस्करण चला रहे हैं? यह जानने के लिए आप SessionInfo () चला सकते हैं। अन्य डेटा स्लॉट्स में संबंधित ऑब्जेक्ट्स को हटाने का व्यवहार जब @data ऑब्जेक्ट को मैनिपुलेट करने का काम केवल अंतिम जोड़े sp संस्करणों में उपलब्ध है। यदि वर्तमान संस्करण नहीं चल रहा है, तो पैकेज मेनू के तहत "अपडेट पैकेज" के साथ पैकेज को अपडेट करने का प्रयास करें। यदि रनिंग> = विंडोज विस्टा प्रशासक के रूप में चलना सुनिश्चित हो। ऑब्जेक्ट आयामों के पहले और बाद में भी देखें, मंद (आकार), जो पंक्तियों / कॉल की संख्या का प्रतिनिधित्व करता है। पंक्तियों की संख्या फीचर ऑब्जेक्ट की संख्या से मेल खाती है। आप यह देख कर परिणामों की जाँच कर सकते हैं कि क्या स्थानिक वस्तु में पंक्तियों की संख्या @data स्लॉट में पंक्तियों की संख्या से मेल खाती है, यानी मंद (आकार);


आपकी सहायताके लिए धन्यवाद! मैंने स्थानिक जुड़ाव को कम किया क्योंकि मैंने 'मैच' के बजाय 'मर्ज' का उपयोग किया था। मैंने सभी NA पंक्तियों को हटा दिया है, लेकिन जब मैं इसे प्लॉट करता हूं, तो आकृति अभी भी आकृति में मौजूद है। यह क्यों हो रहा है पर कोई विचार?
केली

इस उत्तर में संशोधन 1.0-15 सपा के लिए आवश्यक है। मर्ज फ़ंक्शन का एक विशिष्ट संस्करण अब कहा जाता है, जब एक sp class ऑब्जेक्ट पास किया जाता है, जो सही तरीके से प्रदर्शन करता है कि आप संबंधित स्लॉट्स के साथ पंक्ति आयामों को बनाए रखने के लिए एक से एक मैच करते हैं।
जेफरी इवांस

7

पैकेज में अपडेट के साथ मैं निम्नलिखित सुझाव दूंगा:

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

पिछले संस्करणों में जिसके परिणामस्वरूप "आकार" एक data.frame में coerced किया जाएगा। यह अच्छा है कि sp डेवलपर्स कुछ आर तरीकों को sp ऑब्जेक्ट पर काम करने के लिए शुरू कर रहे हैं। इस अद्यतन को प्रदान करने के लिए धन्यवाद।
जेफरी इवांस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.