2017-08-04 11 views
5

मान लें कि मेरे पास दो डेटाफ्रेम, छात्र और शिक्षक हैं।आर में पंक्तियों के सभी संभावित संयोजन उत्पन्न करें?

students <- data.frame(name = c("John", "Mary", "Sue", "Mark", "Gordy", "Joey", "Marge", "Sheev", "Lisa"), 
        height = c(111, 93, 99, 107, 100, 123, 104, 80, 95), 
        smart = c("no", "no", "yes", "no", "yes", "yes", "no", "yes", "no")) 
teachers <- data.frame(name = c("Ben", "Craig", "Mindy"), 
        height = c(130, 101, 105), 
        smart = c("yes", "yes", "yes")) 

मैं छात्रों और शिक्षकों के सभी संभव संयोजनों "छात्रों" और "शिक्षक" पैदा करते हैं और साथ जानकारी रखने के लिए, मूल रूप से dataframe से पंक्तियों के सभी संयोजनों बनाना चाहते हैं। यह आसानी से लूप और सीबीआईंड के साथ किया जा सकता है, लेकिन बड़े पैमाने पर डेटाफ्रेम के लिए, यह हमेशा के लिए लेता है। एक आर नौसिखिया मदद करें - ऐसा करने का सबसे तेज़ तरीका क्या है?

संपादित करें: यदि यह स्पष्ट नहीं है, मैं उत्पादन निम्न स्वरूप करना चाहते हैं:

rbind(
    cbind(students[1, ], teachers[1, ]), 
    cbind(students[1, ], teachers[2, ]) 
    ... 
    cbind(students[n, ], teachers[n, ])) 

उत्तर

2

आप नीचे दिए गए के रूप में सभी डेटा को संयोजित कर सकते हैं:

do.call(cbind.data.frame,Map(expand.grid,teacher=teachers,students=students)) 

    name.teacher name.students height.teacher height.students smart.teacher smart.students 
1   Ben   John   130    111   yes    no 
2   Craig   John   101    111   yes    no 
3   Mindy   John   105    111   yes    no 
4   Ben   Mary   130    93   yes    no 
5   Craig   Mary   101    93   yes    no 
6   Mindy   Mary   105    93   yes    no 
:   :   :    :    :   :    : 
:   :   :    :    :   :    : 
2

और साथ जानकारी

रखने मैं यह नहीं कर रही है की सिफारिश करेंगे। एक वस्तु में सब कुछ रखने की जरूरत नहीं है।

सिर्फ शिक्षकों और छात्रों को संयोजित करने के लिए, वहाँ

res = expand.grid(teacher_name = teachers$name, student_name = students$name) 

अन्य डेटा में मर्ज करने के लिए है (जो मैं आवश्यक जब तक नहीं कर रही सिफारिश करेंगे):

res[, paste("teacher", c("height", "smart"), sep="_")] <- 
    teachers[match(res$teacher_name, teachers$name), c("height","smart")] 

res[, paste("student", c("height", "smart"), sep="_")] <- 
    students[match(res$student_name, students$name), c("height","smart")] 

यह

head(res) 

    teacher_name student_name teacher_height teacher_smart student_height student_smart 
1   Ben   John   130   yes   111   no 
2  Craig   John   101   yes   111   no 
3  Mindy   John   105   yes   111   no 
4   Ben   Mary   130   yes    93   no 
5  Craig   Mary   101   yes    93   no 
6  Mindy   Mary   105   yes    93   no 
देता है
+0

साइड नोट: 'logical' वर्ग' yes'/'no' मूल्यों के लिए बनाया गया है। 'लॉजिकल' देखें। – Frank

+0

उपयोगी सुविधा, लेकिन मेरे वर्तमान उद्देश्य के लिए मैं सब कुछ एक ही ऑब्जेक्ट –

+1

में रखना चाहता हूं या 'data.table' – akrun

0

आप इस फ़ंक्शन का उपयोग कर सकते हैं

expand.grid.df <- function(...) Reduce(function(...) merge(..., by=NULL), list(...)) 

expand.grid.df(students,teachers) 
संबंधित मुद्दे

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