2013-03-05 6 views
32

मेरे पास दो डेटा सेट हैं जो एक ही आकार के होने चाहिए लेकिन नहीं हैं। मुझे ए से मूल्यों को ट्रिम करने की आवश्यकता है जो बी में नहीं हैं और इसके विपरीत एक रिपोर्ट में जा रहे ग्राफ से शोर को खत्म करने के लिए। (चिंता न करें, इस डेटा स्थायी रूप से हटा नहीं किया जा रहा है!)मूल्यों के वेक्टर के आधार पर आर में डेटा फ्रेम में पंक्तियों को कैसे सब्सक्राइब कर सकता हूं?

मैं निम्नलिखित पढ़ा है:

लेकिन मैं मैं अभी भी इसे सही काम करने में सक्षम नहीं हूं। यहां मेरा कोड है:

bg2011missingFromBeg <- setdiff(x=eg2011$ID, y=bg2011$ID) 
#attempt 1 
eg2011cleaned <- subset(eg2011, ID != bg2011missingFromBeg) 
#attempt 2 
eg2011cleaned <- eg2011[!eg2011$ID %in% bg2011missingFromBeg] 

पहला प्रयास परिणामस्वरूप सेटडिफ वेक्टर में पहले मान को समाप्त करता है। दूसरी कोशिश की पैदावार और बोझल त्रुटि:

Error in `[.data.frame`(eg2012, !eg2012$ID %in% bg2012missingFromBeg) 
: undefined columns selected 
+0

क्या आपने 'विलय' करने का प्रयास किया था? – A5C1D2H2I1M1N2O1R2T1

+0

मुझे नहीं लगता कि 'मर्ज' यहां उपयुक्त है। मैं नहीं चाहता कि डेटासेट को जोड़ा जाए। – Zelbinian

+8

नहीं, मुझे लगता है कि 'विलय' बिल्कुल उचित है। एक आंतरिक जुड़ाव आपको केवल पंक्तियों को देगा जो ए और बी दोनों में हैं, फिर आप विलय को किसी भी अपरिवर्तनीय जोड़े जाने पर परिणाम के कॉलम को सब्सक्राइब कर सकते हैं। – joran

उत्तर

49

यह आपको दे देंगे आप क्या चाहते हैं:

eg2011cleaned <- eg2011[!eg2011$ID %in% bg2011missingFromBeg, ] 

अपने दूसरे प्रयास में त्रुटि है, क्योंकि आप ,

सामान्य में भूल गया, के लिए सुविधा, विनिर्देश object[index] 2 डी object के लिए कॉलम सबसेट करता है। यदि आप पंक्तियों को सब्सक्राइब करना चाहते हैं और सभी कॉलम रखना चाहते हैं तो आपको विनिर्देश object[index_rows, index_columns] का उपयोग करना होगा, जबकि index_cols खाली छोड़ा जा सकता है, जो डिफ़ॉल्ट रूप से सभी कॉलम का उपयोग करेगा।

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

data_A[match(data_B$index, data_A$index, nomatch=0),] 
data_B[match(data_A$index, data_B$index, nomatch=0),] 

यह वह जगह है,,:

+0

हां, यह समस्या हल करता है। मैं अन्य उत्तरों की प्रतीक्षा करूंगा, हालांकि, अगर कोई वास्तव में कुछ चालाक के साथ आता है। :) – Zelbinian

+0

'सबसेट' काम करेगा यदि आप लॉजिकल स्टेटमेंट को 'सबसेट (उदाहरण के लिए,%%%% bg2011missingFromBeg) में बदलते हैं, तो –

+0

यह वास्तव में वही उत्तर है जैसा मैंने लिखा था। एडिबेंडर का उत्तर चुनें, क्योंकि यह आपकी समस्या को सीधे हल करता है। अगर मैंने बाद में इस पृष्ठ पर ठोकर खाई तो मैंने केवल दूसरों के लिए एक और मजबूत संदर्भ के रूप में उपयोग करने में सक्षम होने के लिए मेरा जोड़ा। – Dinre

14

आप वास्तव में सिर्फ एक सूचकांक है कि दोनों डेटा फ्रेम में मौजूद है द्वारा प्रत्येक डेटा फ्रेम सबसेट को चाहते हैं, तो आप इस 'मैच' समारोह के साथ इतना की तरह कर सकते हैं, एक ही रूप में:

data_A[data_A$index %in% data_B$index,] 
data_B[data_B$index %in% data_A$index,] 

यहाँ एक डेमो है:

# Set seed for reproducibility. 
set.seed(1) 

# Create two sample data sets. 
data_A <- data.frame(index=sample(1:200, 90, rep=FALSE), value=runif(90)) 
data_B <- data.frame(index=sample(1:200, 120, rep=FALSE), value=runif(120)) 

# Subset data of each data frame by the index in the other. 
t_A <- data_A[match(data_B$index, data_A$index, nomatch=0),] 
t_B <- data_B[match(data_A$index, data_B$index, nomatch=0),] 

# Make sure they match. 
data.frame(t_A[order(t_A$index),], t_B[order(t_B$index),])[1:20,] 

# index  value index.1 value.1 
# 27  3 0.7155661  3 0.65887761 
# 10 12 0.6049333  12 0.14362694 
# 88 14 0.7410786  14 0.42021589 
# 56 15 0.4525708  15 0.78101754 
# 38 18 0.2075451  18 0.70277874 
# 24 23 0.4314737  23 0.78218212 
# 34 32 0.1734423  32 0.85508236 
# 22 38 0.7317925  38 0.56426384 
# 84 39 0.3913593  39 0.09485786 
# 5  40 0.7789147  40 0.31248966 
# 74 43 0.7799849  43 0.10910096 
# 71 45 0.2847905  45 0.26787813 
# 57 46 0.1751268  46 0.17719454 
# 25 48 0.1482116  48 0.99607737 
# 81 53 0.6304141  53 0.26721208 
# 60 58 0.8645449  58 0.96920881 
# 30 59 0.6401010  59 0.67371223 
# 75 61 0.8806190  61 0.69882454 
# 63 64 0.3287773  64 0.36918946 
# 19 70 0.9240745  70 0.11350771 
+0

के लिए भी सच है, मुझे यह देखने दो कि क्या मैं 'data_A [डेटा_ए $ इंडेक्स%% data_B $ अनुक्रमणिका,] शब्दों में दोहरा सकता हूं। मुझे डेटा_ए में सभी पंक्तियां दें जो उनके इंडेक्स के आधार पर डेटा_ए और डेटाबी दोनों में हैं। क्या मेरे पास यह सही है? – Zelbinian

+3

@ ज़ेलबिनियन विशेष रूप से, यह कहता है: मुझे डेटा_ए में सभी पंक्तियां दें जहां डेटा_ए में पंक्तियों का सूचकांक मान डेटा_B में इंडेक्स मानों में पाया जा सकता है। यह थोड़ा अलग कथन है, लेकिन आप इसे मूल रूप से सही है। केवल अंतर यह है कि हम विशेष रूप से डेटा_ए से पंक्ति संख्या चाहते हैं।यदि आपने कथन को उलट दिया है, तो यह सही काम नहीं करेगा। – Dinre

+0

अच्छा पुनरुत्पादित उदाहरण + स्पष्टीकरण। –

1

मूल पोस्ट के लिए टिप्पणियों के अनुसार, मीटर erges/joins इस समस्या के लिए उपयुक्त हैं। विशेष रूप से, आंतरिक शामिल केवल उन मानों को वापस कर देगा जो डेटाफ्रेम दोनों में मौजूद हैं, setdiff कथन अनावश्यक बनाते हैं।

Dinre के उदाहरण से डेटा का उपयोग करना:

आधार आर में:

library(dplyr) 
cleanedA <- inner_join(data_A, data_B %>% select(index)) 
cleanedB <- inner_join(data_B, data_A %>% select(index)) 

दो अलग-अलग टेबल के रूप में डेटा रखने के लिए:

cleanedA <- merge(data_A, data_B[, "index"], by = 1, sort = FALSE) 
cleanedB <- merge(data_B, data_A[, "index"], by = 1, sort = FALSE) 

dplyr पैकेज का उपयोग करना , प्रत्येक में केवल अपने चर होते हैं, यह अवांछित तालिका को केवल इसके लिए सब्सक्राइब करता है शामिल होने से पहले सूचकांक चर। फिर परिणामी तालिका में कोई नया चर जोड़ा नहीं जाता है।

1

सच मानव सुबोध उदाहरण के लिए, कैसे दो डेटा फ्रेम तुलना और केवल पंक्तियों विशिष्ट स्तंभ में समान मूल्यों से युक्त रखने के लिए (यह पहली बार मैं% में% का उपयोग कर रहा है के रूप में):

# Set seed for reproducibility. 
set.seed(1) 

# Create two sample data frames. 
data_A <- data.frame(id=c(1,2,3), value=c(1,2,3)) 
data_B <- data.frame(id=c(1,2,3,4), value=c(5,6,7,8)) 

# compare data frames by specific columns and keep only 
# the rows with equal values 
data_A[data_A$id %in% data_B$id,] # will keep data in data_A 
data_B[data_B$id %in% data_A$id,] # will keep data in data_b 

परिणाम:

> data_A[data_A$id %in% data_B$id,] 
    id value 
1 1  1 
2 2  2 
3 3  3 

> data_B[data_B$id %in% data_A$id,] 
    id value 
1 1  5 
2 2  6 
3 3  7 
संबंधित मुद्दे

 संबंधित मुद्दे