संपादित
मैं इस SO post है, जो एक data.table में लापता पंक्तियों को सम्मिलित करने के लिए एक बेहतर तरीका भी शामिल पाया जाता है। फंक्शन fun_DT
तदनुसार समायोजित । कोड अब क्लीनर है; मुझे हालांकि कोई गति सुधार नहीं दिख रहा है।
अन्य पोस्ट पर मेरा अपडेट देखें। अरुण का समाधान भी काम करता है, लेकिन आपको लापता संयोजनों को मैन्युअल रूप से डालना होगा। चूंकि आपके पास यहां अधिक पहचानकर्ता कॉलम हैं (आईडी, महीना), मैं केवल यहां एक गंदे समाधान के साथ आया हूं (पहले आईडी 2 बनाना, फिर सभी आईडी 2-श्रेणी संयोजन बनाना, फिर डेटाटेबल भरना, फिर रीशेपिंग करना)।
मुझे यकीन है कि यह सबसे अच्छा समाधान नहीं है, लेकिन यदि this FR बनाया गया है, तो ये चरण स्वचालित रूप से किए जा सकते हैं।
समाधान लगभग एक ही गति के अनुसार हैं, हालांकि यह देखना दिलचस्प होगा कि कैसे स्केल (मेरी मशीन बहुत धीमी है, इसलिए मैं आगे बढ़ाना नहीं चाहता ... कंप्यूटर अक्सर पहले से दुर्घटनाग्रस्त हो गया है ;-)
library(data.table)
library(rbenchmark)
fun_reshape <- function(n) {
DT <- data.table(
ID=sample(1:100, n, replace=TRUE),
Month=sample(1:12, n, replace=TRUE),
Category=sample(1:10, n, replace=TRUE),
Qty=runif(n)*500,
key=c('ID', 'Month')
)
agg <- DT[, list(Qty = sum(Qty)), by = c("ID", "Month", "Category")]
reshape(agg, v.names = "Qty", idvar = c("ID", "Month"),
timevar = "Category", direction = "wide")
}
#UPDATED!
fun_DT <- function(n) {
DT <- data.table(
ID=sample(1:100, n, replace=TRUE),
Month=sample(1:12, n, replace=TRUE),
Category=sample(1:10, n, replace=TRUE),
Qty=runif(n)*500,
key=c('ID', 'Month')
)
agg <- DT[, list(Qty = sum(Qty)), by = c("ID", "Month", "Category")]
agg[, ID2 := paste(ID, Month, sep="_")]
setkey(agg, ID2, Category)
agg <- agg[CJ(unique(ID2), unique(Category))]
agg[, as.list(setattr(Qty, 'names', Category)), by=list(ID2)]
}
library(rbenchmark)
n <- 1e+07
benchmark(replications=10,
fun_reshape(n),
fun_DT(n))
test replications elapsed relative user.self sys.self user.child sys.child
2 fun_DT(n) 10 45.868 1 43.154 2.524 0 0
1 fun_reshape(n) 10 45.874 1 42.783 2.896 0 0
क्या आप तालिका के शरीर को 'मात्रा' से भरने का मतलब है? किसी भी डुप्लिकेट संयोजन को सारांशित करना? – joran
@ जोरन: मेरे उदाहरण में डुप्लिकेट संयोजन हैं, लेकिन तर्क के लिए, मान लें कि वहां नहीं हैं। मैं चाहता हूं कि श्रेणी फ़ील्ड के प्रत्येक मान के लिए एक अलग कॉलम है, या तो एनए, या 0 गायब संयोजनों के लिए। – Zach
@ जोरान मुझे लगता है कि आपके प्रश्न का सही उत्तर हां है: मैं चाहता हूं कि श्रेणी कॉलम बन जाए, प्रत्येक कॉलम में मात्रा, एनएएस या 0 गुम श्रेणियों के लिए 0, और डुप्लीकेट को सारांशित किया जाना चाहिए (लेकिन यह हमारे सामने संक्षेप करना उचित है नयी आकृति प्रदान)। – Zach