2015-05-13 5 views
8

छोड़ रहा है, मैं एक विभाजक द्वारा कॉलम सामग्री को विभाजित करने और एक तालिका को एक लंबे प्रारूप में परिवर्तित करने का एक तरीका खोज रहा था। मुझे पैकेज से cSplit मिला और यह लगभग वही कर रहा है जो मैं ढूंढ रहा था।सीएसप्लिट लाइब्रेरी (स्प्लिटस्टैकशिप) हमेशा कॉलम

समस्या अब drop विकल्प के साथ है। मुझे उम्मीद थी कि मेरे विभाजन कॉलम को एक तरह से कॉपी किया जाए, लेकिन ऐसा नहीं होता है। क्या मैं इसे गलत कर रहा हूँ? किसी ने समस्या का अनुभव किया?

मुझे यकीन नहीं है कि मैं कुछ गलत करता हूं, लेकिन drop = FALSE विकल्प मेरे मामले में काम नहीं कर रहा है।

library(splitstackshape) 
jnk <- data.table(a = '1,2,3,4,5', b = 5) 
jnk 
#   a b 
# 1: 1,2,3,4,5 5 

cSplit(jnk, 'a', ',', 'long', drop = FALSE) 
# a b 
# 1: 1 5 
# 2: 2 5 
# 3: 3 5 
# 4: 4 5 
# 5: 5 5 

मैं क्या उम्मीद कुछ इस तरह था:

cSplit(jnk, 'a', ',', 'long', drop = FALSE) 
# a b a.orig 
# 1: 1 5 1,2,3,4,5 
# 2: 2 5 1,2,3,4,5 
# 3: 3 5 1,2,3,4,5 
# 4: 4 5 1,2,3,4,5 
# 5: 5 5 1,2,3,4,5 

मैं उपयोग कर रहा हूँ संस्करण 1.4.2

+0

यह अगर, df में अधिक लाइनों देखते हैं के बाद से 'JNK [[ 'एक']]' एक ही लंबाई की जरूरत है या हर बार संलग्न हो जाता है काम नहीं यकीन है कि के लिए करता है ... तो यह 'jnk <- data.table (a = c ('1,2,3,4,5', '1,2,3', '2,3') के साथ काम नहीं कर रहा है, बी = सी (5,4 , 3)) ' – drmariod

उत्तर

10

"लंबे" प्रारूप स्तंभ को संशोधित करता

यहाँ एक उदाहरण है list(unlist(...)) का उपयोग करके "data.table" के भीतर, := के साथ असाइन किया गया। इसलिए, यदि drop का उपयोग किया गया था, तो आप कॉलम को विभाजित करेंगे और फिर इसे हटा देंगे!

मुझे लगता है कि dropwide प्रारूप के लिए ही है यह दस्तावेज में स्पष्ट बनाने के लिए, या एक उपयोगकर्ता लंबे प्रारूप में drop उपयोग करने का प्रयास करता है, तो एक message जोड़ने की कोशिश करेंगे। file a FR or submit a PR पर निःशुल्क महसूस करें।

वैकल्पिक हल एक और स्तंभ आवंटित करने के लिए (जैसे कि, "a_orig") और फिर बंटवारे करना होगा:

jnk <- data.table(a=c('1,2,3,4,5','1,2,3','2,3'),b=c(5,4,3)) 
cSplit(jnk[, a_orig := a], "a", ",", "long") 
#  a b a_orig 
# 1: 1 5 1,2,3,4,5 
# 2: 2 5 1,2,3,4,5 
# 3: 3 5 1,2,3,4,5 
# 4: 4 5 1,2,3,4,5 
# 5: 5 5 1,2,3,4,5 
# 6: 1 4  1,2,3 
# 7: 2 4  1,2,3 
# 8: 3 4  1,2,3 
# 9: 2 3  2,3 
# 10: 3 3  2,3 

मैं बड़े पैमाने पर परीक्षण नहीं किया है, लेकिन एक संभव फिक्स हो सकता है:

cSplit2 <- function(indt, splitCols, sep = ",", direction = "wide", 
        fixed = TRUE, drop = TRUE, stripWhite = TRUE, 
        makeEqual = NULL, type.convert = TRUE) { 
    if (direction == "long" & !drop) { 
    indt <- as.data.table(indt) 
    indt[, `:=`(eval(paste(splitCols, "orig", sep = "_")), 
       lapply(splitCols, function(x) indt[[x]]))] 
    } 
    cSplit(indt, splitCols, sep, direction, fixed, drop, stripWhite, 
     makeEqual, type.convert) 
} 

मूल विचार ही इनपुट डाटासेट यदि direction == "wide" और drop = FALSE बदलने के लिए है। यह आपके विचार के समान है, लेकिन संभवतः वास्तविक पैकेज में एकीकृत समाधान हो सकता है, कहीं line 94 के आसपास। इस मामले में, केवल indt[, `:=`(eval(paste(splitCols, "orig", sep = "_")), lapply(splitCols, function(x) indt[[x]]))] भाग आवश्यक होना चाहिए।

0

प्रतिक्रिया के लिए धन्यवाद, मैंने एक कामकाज के रूप में एक छोटा सा काम लिखा था। मुझे इसे ठीक से काम करने के लिए data.tabledata.frame में बदलना पड़ा। data.table के मामले में मुझे एक अतिरिक्त पैरामीटर सेट करने की आवश्यकता है लेकिन यह data.frame के साथ दुर्घटनाग्रस्त हो जाता है। मेरे मामले में मुझे अधिकांश समय data.frame की आवश्यकता है, इसलिए मैंने इसे इसके लिए अनुकूलित किया।

library(splitstackshape) 
jnk <- data.frame(a = c('1,2,3,4,5','1,2,3','2,3'), 
        b = c('a,b,c,d,e','a,b,c','a,b'), 
        c = c(5,4,3)) 
jnk 

myCSplit <- function(data_set, splitCols, sep = ',', direction = 'long', drop = TRUE, ...) { 
    if(direction == 'long' & !drop) { 
    orig_names <- sub('$', '_orig', splitCols) 
    df <- as.data.frame(data_set[,splitCols]) 
    names(df) <- orig_names 
    df2 <- cbind(data_set, df) 
    return(cSplit(df2, splitCols, sep, 'long')) 
    } else { 
    return(cSplit(data_set, splitCols, sep, direction, drop = drop,...)) 
    } 
} 
myCSplit(jnk, 'a', ',') 
myCSplit(jnk, 'a', ',', drop = FALSE) 
myCSplit(jnk, 'a', ',', 'wide') 
myCSplit(jnk, 'a', ',', 'wide', drop = FALSE) 
myCSplit(jnk, c('a','b'), ',', 'long', drop = FALSE) 
+2

मुझे अधिक सामान्य कामकाज के साथ दोपहर के भोजन से वापस आने दो। – A5C1D2H2I1M1N2O1R2T1

+0

अरे @ अंदांडाहो शायद आप इस सुविधा को अगली रिलीज में जोड़ सकते हैं ... मेरे मामले में यह बहुत उपयोगी होगा। – drmariod

+2

जहां तक ​​मैं कह सकता हूं, यह मेरे लिए केवल एक पंक्ति के साथ ठीक करने के लिए संभव होना चाहिए। हालांकि मुझे देखने के लिए कुछ परीक्षण करना होगा। – A5C1D2H2I1M1N2O1R2T1

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