पर कॉलम-वार मतभेद लें I डेटा.table बनाने के लिए डेटाटेबल सिंटैक्स का उपयोग कैसे कर सकते हैं जहां प्रत्येक कॉलम में मूल डेटा.table और अगले कॉलम के कॉलम के बीच अंतर होता है?डेटाटेबल
उदाहरण: मैं एक data.table जहां प्रत्येक पंक्ति एक समूह है, और प्रत्येक स्तंभ के रूप में इस तरह के साल 0 के बाद जनसंख्या जीवित है, साल 1, 2 के बाद, आदि:
pop <- data.table(group_id = c(1, 2, 3),
N = c(4588L, 4589L, 4589L),
N_surv_1 = c(4213, 4243, 4264),
N_surv_2 = c(3703, 3766, 3820),
N_surv_3 = c(2953, 3054, 3159))
# group_id N N_surv_1 N_surv_2 N_surv_3
# 1 4588 4213 3703 2953
# 2 4589 4243 3766 3054
# 3 4589 4264 3820 3159
(डेटा प्रकार भिन्न होती हैं क्योंकि एन एक सच्चे पूर्णांक गिनती और N_surv_1, आदि अनुमानों कि आंशिक हो सकता है कर रहे हैं)
मैंने क्या किया:। आधार diff
और मैट्रिक्स स्थानांतरण का उपयोग कर, हम कर सकते हैं:
diff <- data.table(t(diff(t(as.matrix(pop[,-1,with=FALSE])))))
setnames(diff, paste0("deaths_",1:ncol(diff)))
cbind(group_id = pop[,group_id],diff)
# produces desired output:
# group_id deaths_1 deaths_2 deaths_3
# 1 -375 -510 -750
# 2 -346 -477 -712
# 3 -325 -444 -661
मुझे पता है कि मैं एक एकल स्तंभ melt.data.table
द्वारा उत्पादित पर समूह द्वारा आधार diff
उपयोग कर सकते हैं, तो यह काम करता है लेकिन सुंदर नहीं है:
melt(pop,
id.vars = "group_id"
)[order(group_id)][, setNames(as.list(diff(value)),
paste0("deaths_",1:(ncol(pop)-2))),
keyby = group_id]
है कि करने के लिए सबसे data.table-riffic रास्ता ऐसा करें, या डेटा.table में बहु-कॉलम ऑपरेशन के रूप में ऐसा करने का कोई तरीका है?
दिलचस्प पिघला हुआ धीमा है, लेकिन मुझे लगता है कि यह आश्चर्यजनक नहीं है। मैं अभी भी डेटा स्टोर करने के लिए "सही" तरीका के रूप में इसे वकील करता हूं। यही है, यह प्रत्येक समूह के लिए जनसंख्या माप के अनुक्रम को कैप्चर करने वाले कुछ "समय" कॉलम के साथ लंबा रूप होना चाहिए। मैं अक्रुन के समाधान का अनुमान लगा रहा हूं (मेरे उत्तर में मिला: 'पॉप [, एसडी [, -1, साथ = गलत] - .SD [, -ncol (.SD), = FALSE के साथ], .SDcols = ncols] ') भी काफी तेज़ है। – Frank