2012-06-11 27 views
6

मेरे पास दो डेटाफ्रेम हैं जिनमें प्रत्येक दो कॉलम हैं (उदाहरण के लिए, एक्स और वाई)। मुझे दो डेटाफ्रेम की तुलना करने की आवश्यकता है और देखें कि एक्स या वाई या दोनों एक्स और वाई दोनों में से कोई भी मान दो डेटाफ्रेम में समान है या नहीं।दो डेटाफ्रेम की तुलना कैसे करें?

+2

हमें यह जानने की आवश्यकता होगी कि डेटा फ्रेम में क्या है: पूर्णांक, संख्यात्मक, कारक, कुछ और? उदाहरण के लिए यादृच्छिक संख्यात्मक डेटा युक्त एक साधारण उदाहरण डेटा फ्रेम 'df1 <- data.frame (x = rnorm (10), y = rnorm (10)) द्वारा किया जा सकता है, और इनमें से दो को सीधे घटाया जा सकता है बशर्ते उनके पास समान कॉलम नाम (लेकिन आपकी पंक्तियों का क्रम सही उत्तर के लिए महत्वपूर्ण होगा)। –

उत्तर

27

all.equal फ़ंक्शन का उपयोग करें। यह डेटा फ्रेम को सॉर्ट नहीं करता है। यह प्रत्येक सेल को उसी सेल के विरुद्ध data frame में बस प्रत्येक सेल की जांच करेगा। आप identical() फ़ंक्शन का भी उपयोग कर सकते हैं।

2

उदाहरण के बिना मैं निश्चित नहीं हो सकता कि मैं समझता हूं कि आप क्या चाहते हैं। हालांकि, मुझे लगता है कि आप ऐसा कुछ चाहते हैं। यदि हां, तो वही काम करने के लगभग निश्चित तरीके हैं।

a <- matrix(c(1,2, 
       3,4, 
       5,6, 
       7,8), nrow=4, byrow=T, dimnames = list(NULL, c("x","y"))) 

b <- matrix(c(1,2, 
       9,4, 
       9,6, 
       7,9), nrow=4, byrow=T, dimnames = list(NULL, c("x","y"))) 

cc <- matrix(c(NA,NA, 
       NA,NA, 
       NA,NA, 
       NA,NA), nrow=4, byrow=T, dimnames = list(NULL, c("x","y"))) 

for(i in 1:dim(a)[1]) { 
for(j in 1:dim(a)[2]) { 
if(a[i,j]==b[i,j]) cc[i,j]=a[i,j] 
} 
} 

cc 

संपादित करें 8 जनवरी, 2013

निम्न पंक्ति आपको बता देंगे जो कोशिकाओं दो मैट्रिक्स के बीच भिन्न:

which(a != b, arr.ind=TRUE) 

#  row col 
# [1,] 2 1 
# [2,] 3 1 
# [3,] 4 2 

दो मेट्रिसेस, ए और बी, तो समान हैं, तो :

which(a != b) 

# integer(0) 

which(a != b, arr.ind=TRUE) 

# row col 

संपादित करें जनवरी 9, 2012

निम्न कोड उस प्रभाव को दर्शाता है जो पंक्ति नाम identical, all.equal और which पर हो सकता है जब दो डेटा फ्रेमों में से एक तीसरे डेटा फ्रेम को सब्सक्राइब करके बनाया जाता है। यदि दो डेटा फ्रेम की तुलना में पंक्ति नाम भिन्न होते हैं तो न तो identical और न ही all.equalTRUE वापस आ जाएगा। हालांकि, which को दो डेटा फ्रेम के बीच कॉलम x और y की तुलना करने के लिए अभी भी उपयोग किया जा सकता है। यदि दो डेटा फ्रेम की तुलना में पंक्ति नाम NULL पर सेट किए गए हैं तो identical और all.equal दोनों TRUE वापस आ जाएंगे।

df1 <- read.table(text = " 
    group x y 
     1 10 20 
     1 10 20 
     1 10 20 
     1 10 20 
     2 1 2 
     2 3 4 
     2 5 6 
     2 7 8 
", sep = "", header = TRUE) 

df2 <- read.table(text = " 
    group x y 
     2 1 2 
     2 3 4 
     2 5 6 
     2 7 8 
", sep = "", header = TRUE) 

# df3 is a subset of df1 

df3 <- df1[df1$group==2,] 

# rownames differ between df2 and df3 and 
# therefore neither 'all.equal' nor 'identical' return TRUE 
# even though the i,j cells of df2 and df3 are the same. 
# Note that 'which' indicates no i,j cells differ between df2 and df3 

df2 
df3 

all.equal(df2, df3) 
identical(df2, df3) 
which(df2 != df3) 

# set row names to NULL in both data sets and 
# now both 'all.equal' and 'identical' return TRUE. 
# Note that 'which' still indicates no i,j cells differ between df2 and df3 

rownames(df2) <- NULL 
rownames(df3) <- NULL 

df2 
df3 

all.equal(df2, df3) 
identical(df2, df3) 
which(df2 != df3) 
संबंधित मुद्दे