2016-01-16 5 views
17

dropdcast में तर्क (" reshape2 "या" dplyr "से)" लंबे "से" व्यापक "तक जाने पर उपयोगी हो सकता है "डेटासेट और आप संयोजनों के लिए भी कॉलम बनाना चाहते हैं जो लंबे रूप में मौजूद नहीं हैं।`dcast` में 'ड्रॉप' तर्क केवल सूत्र के आरएचएस को देखें

यह पता चला है कि drop का उपयोग फॉर्मूला के बाएं हाथ की तरफ (एलएचएस) के साथ-साथ दाएं हाथ की ओर (आरएचएस) को भी प्रभावित करता है। इस प्रकार, यह एलएचएस मूल्यों के संयोजन के आधार पर अतिरिक्त पंक्तियां भी बनाता है।

क्या इस व्यवहार को ओवरराइड करने का कोई तरीका है?

library(data.table) 
DT <- data.table(v1 = c(1.105, 1.105, 1.105, 2.012, 2.012, 2.012), 
       ID = c(1L, 1L, 1L, 2L, 2L, 2L), 
       v2 = structure(c(2L, 3L, 5L, 1L, 2L, 6L), 
           .Label = c("1", "2", "3", "4", "5", "6"), 
           class = "factor"), 
       v3 = c(3L, 2L, 2L, 5L, 4L, 3L)) 

सूचना है कि "वी 2" 6 के स्तर के साथ एक factor स्तंभ है:


यहाँ कुछ नमूना डेटा है। मैं अनिवार्य रूप से "लंबे" चौड़ा करने के लिए से जाना "है, लेकिन किसी भी लापता कारक के स्तर के लिए कॉलम में जोड़ने (इस मामले में" 4 ") करना चाहते हैं

reshape आकार संभालती है, लेकिन नहीं याद आ रही कॉलम:।

reshape(DT, direction = "wide", idvar = c("ID", "v1"), timevar = "v2") 
#  v1 ID v3.2 v3.3 v3.5 v3.1 v3.6 
# 1: 1.105 1 3 2 2 NA NA 
# 2: 2.012 2 4 NA NA 5 3 

dcast लापता कॉलम जोड़ने के हैंडल, लेकिन केवल वहाँ एलएचएस पर एक मूल्य है कि अगर:

dcast(DT, ID ~ v2, value.var = "v3", drop = FALSE) 
# ID 1 2 3 4 5 6 
# 1: 1 NA 3 2 NA 2 NA 
# 2: 2 5 4 NA NA NA 3 

एलएचएस, एलएचएस पर मूल्यों के संयोजन पर एक से अधिक मान नहीं हैं, तो यह भी पता विस्तारित किया जाता है के रूप में, अगर हमनेका उपयोग किया थाया expand.grid, लेकिन पंक्तियों 2 और 3 के सभी पसंदीदा में मेरे लिए नहीं हैं: ftable(xtabs(v3 ~ ID + v1 + v2, DT)):

dcast(DT, ... ~ v2, value.var = "v3", drop = FALSE) 
#  v1 ID 1 2 3 4 5 6 
# 1: 1.105 1 NA 3 2 NA 2 NA 
# 2: 1.105 2 NA NA NA NA NA NA 
# 3: 2.012 1 NA NA NA NA NA NA 
# 4: 2.012 2 5 4 NA NA NA 3 

इस आधार आर में xtabs का उपयोग कर के समान है।


वहाँ dcast पता है कि अनिवार्य रूप से, यह बताने के लिए एक रास्ता है "अरे। एलएचएस पर मूल्यों के संयोजन ID कर रहे हैं। मेरे लिए उन्हें भरने के लिए कोशिश मत करो।"

मेरा वर्तमान दृष्टिकोण तीन चरणों को करना है, एक एलएचएस मूल्यों को ध्वस्त करने के लिए, दूसरा आरएचएस मूल्यों को फैलाने के लिए, और फिर परिणाम विलय करने के लिए।

merge(DT[, list(v1 = unique(v1)), .(ID)], ## or unique(DT[, c("ID", "v1"), with = FALSE]) 
     dcast(DT, ID ~ v2, value.var = "v3", drop = FALSE), 
     by = "ID")[] 
# ID v1 1 2 3 4 5 6 
# 1: 1 1.105 NA 3 2 NA 2 NA 
# 2: 2 2.012 5 4 NA NA NA 3 

क्या कोई बेहतर दृष्टिकोण है जो मुझे याद आ रही है?

+0

कुछ करीबी (हो सकता है): 'dcast (डीटी, बातचीत (v1, आईडी, ड्रॉप = TRUE) ~ वी 2, value.var =" वी 3 ", ड्रॉप = false)'। हालांकि, आपको पहले कॉलम को बाद में विभाजित करना होगा। – nicola

+0

@nicola, मैंने इसके बारे में सोचा, लेकिन मुझे डेटा की निष्ठा में संभावित हानि, एलएचएस पर '...' का उपयोग करने के विकल्प की कमी और कॉलम नामों की हानि पसंद नहीं आया। – A5C1D2H2I1M1N2O1R2T1

+0

एक संभावित समाधान 'ड्रॉप' में डबल लॉजिकल की अनुमति दे सकता है। कुछ 'ड्रॉप = सी (सत्य, गलत)' जैसा है जहां पहला आरएचएस पर लागू होता है और दूसरा एलएचएस पर लागू होता है। – Jaap

उत्तर

7

बस डेटाटेबल विकास संस्करण v1.9.7, commit 2113 में कार्यान्वित किया गया, #1512 बंद करता है।

require(data.table) # v1.9.7, commit 2113+ 
dcast(DT, ... ~ v2, value.var = "v3", drop = c(TRUE, FALSE)) 
#  v1 ID 1 2 3 4 5 6 
# 1: 1.105 1 NA 3 2 NA 2 NA 
# 2: 2.012 2 5 4 NA NA NA 3 
संबंधित मुद्दे