2016-12-21 15 views
6

मुझे अभी तक डुप्लिकेट नहीं मिल रहा है।दो डेटाटेबल गुणा करें, सभी संभावनाएं रखें

मैं दो data.tables है:

मेरे समस्या निम्नलिखित है। एक दो कॉलम (फीचर, गिनती) के साथ, दूसरा तीन कॉलम (फीचरब, फीचरसी, गिनती) के साथ। मैं (?) गुणा करना चाहता हूं, ताकि मेरे पास सभी संभावनाओं के साथ एक नया data.table हो। चाल यह है कि ये सुविधाएं मेल नहीं खाती हैं, इसलिए merge समाधान चाल नहीं कर सकते हैं।

MRE इस प्रकार है:

# two columns 
DT1 <- data.table(featurea =c("type1","type2"), count = c(2,3)) 

#  featurea count 
#1: type1  2 
#2: type2  3 

#three columns 
DT2 <- data.table(origin =c("house","park","park"), color =c("red","blue","red"),count =c(2,1,2)) 

# origin color count 
#1: house red  2 
#2: park blue  1 
#3: park red  2 

मेरे अपेक्षित परिणाम, इस मामले में, एक data.table इस प्रकार है:

> DT3 
    origin color featurea total 
1: house red type1  4 
2: house red type2  6 
3: park blue type1  2 
4: park blue type2  3 
5: park red type1  4 
6: park red type2  6 
+1

'DT2 [, (featurea = DT1 [[" featurea "]], संख्या = गिनती चाहेंगे * DT1 [[" गिनती "]]), द्वारा =। (मूल, रंग)] 'पर्याप्त कुशल हो? – Roland

+1

@ रोलैंड ऐसा लगता है, और यह सबसे अच्छा जवाब लगता है, इसलिए आपको इसे – Tensibai

उत्तर

6

यह एक तरीका होगा। सबसे पहले, splitstackshape पैकेज में expandRows() के साथ DT2 में पंक्तियों का विस्तार किया। प्रत्येक पंक्ति को दो बार दोहराया जाता है क्योंकि मैंने count = 2, count.is.col = FALSE निर्दिष्ट किया है। फिर, मैंने गुणा की देखभाल की और total नामक एक नया कॉलम बनाया। उसी समय, मैंने featurea के लिए एक नया कॉलम बनाया। अंत में, मैंने count गिरा दिया।

library(data.table) 
library(splitstackshape) 

expandRows(DT2, count = nrow(DT1), count.is.col = FALSE)[, 
    `:=` (total = count * DT1[, count], featurea = DT1[, featurea])][, count := NULL] 

संपादित

आप एक और पैकेज में शामिल नहीं करना चाहते हैं, आप अपने टिप्पणी में दाऊद का विचार कर सकते हैं।

DT2[rep(1:.N, nrow(DT1))][, 
    `:=`(total = count * DT1$count, featurea = DT1$featurea, count = NULL)][] 



# origin color total featurea 
#1: house red  4 type1 
#2: house red  6 type2 
#3: park blue  2 type1 
#4: park blue  3 type2 
#5: park red  4 type1 
#6: park red  6 type2 
+0

@ डेविड एडनबर्ग हाँ के रूप में पोस्ट करना चाहिए, मैं आपके साथ सहमत हूं। यदि ओपी एक और विस्तृत उदाहरण प्रदान करता है, तो इस विचार को एक संशोधन की आवश्यकता है। 'एन्रो (डीटी 1) 'एक अच्छा विचार है। – jazzurro

+0

@jazzurro एक और अधिक संपूर्ण उदाहरण के लिए क्या आवश्यकता होगी? मेरा डेटासेट इससे भी बड़ा है, और उसके पास समान कॉलम नाम नहीं हैं। मैं अभी भी ऊपर की ओर, हालांकि – erasmortg

+0

@erasmortg मेरा मतलब यह नहीं था कि मुझे पूरे डेटा सेट की आवश्यकता होगी। गलतफहमी के लिए खेद है। – jazzurro

0

समाधान के साथ dplyr

library(dplyr) 
library(data.table) 

DT1 <- data.table(featurea =c("type1","type2"), count = c(2,3)) 
DT2 <- data.table(origin =c("house","park","park"), color =c("red","blue","red"),count =c(2,1,2)) 

एक डमी स्तंभ बनाएं भीतरी में शामिल होने पर करने के लिए (मेरे लिए key):

inner_join(DT1 %>% mutate(key=1), 
      DT2 %>% mutate(key=1), by="key") %>% 
mutate(total=count.x*count.y) %>% 
select(origin, color, featurea, total) %>% 
arrange(origin, color) 
8

कृपया बड़े डेटा पर परीक्षण, मुझे यकीन है कि नहीं कर रहा हूँ यह कितना अनुकूलित है:

DT2[, .(featurea = DT1[["featurea"]], 
     count = count * DT1[["count"]]), by = .(origin, color)] 
# origin color featurea count 
#1: house red type1  4 
#2: house red type2  6 
#3: park blue type1  2 
#4: park blue type2  3 
#5: park red type1  4 
#6: park red type2  6 
,210

यह उसके चारों ओर स्विच करने के लिए और अधिक कुशल हो सकता है अगर DT1 कम समूहों है:।

DT1[, c(DT2[, .(origin, color)], 
     .(count = count * DT2[["count"]])), by = featurea] 
# featurea origin color count 
#1: type1 house red  4 
#2: type1 park blue  2 
#3: type1 park red  4 
#4: type2 house red  6 
#5: type2 park blue  3 
#6: type2 park red  6 
संबंधित मुद्दे