2015-10-26 7 views
7

मैं सशर्त एक data.frame से स्तंभ के चयन के लिए निम्नलिखित मुहावरा का उपयोग से स्तंभ के चयन के लिए:मुहावरा सशर्त एक data.table

DF = data.frame(a = 1:3,b = letters[1:3],c = LETTERS[1:3]) 
someCondition <- FALSE 

# use `if(someCondition)` to conditionally include column 'c' 
DF[,c('a','b',if(someCondition)'c')] 
:> a b 
:> 1 1 a 
:> 2 2 b 
:> 3 3 c 

लेकिन बराबर data.table के बी/सी शून्य साथ काम नहीं करता मूल्यों सूची से गिरा नहीं कर रहे हैं उसी तरह वे संयोजन से हटा दिया जाता है:

DT = as.data.table(DF) 
DT[,.(a,b,if(someCondition)c)] 
:> Error in setnames(jval, jvnames) : 
:> Can't assign 3 names to a 2 column data.table 

मैं एक समारोह .. नामक एक काम के आसपास है जो परिभाषित किया है:

.. <- function(...){ 
    x = list(...) 
    x= x[!sapply(x,is.null)] 
    x 
} 
DT[,..(a,b,if(someCondition)c)] 
:> V1 V2 
:> 1: 1 a 
:> 2: 2 b 
:> 3: 3 c 

लेकिन यह एक ऐसा ऑपरेशन पूरा करने के लिए अपने स्वयं के फ़ंक्शन को शामिल करने के लिए प्रकार की तरह दिखता है जो इतना आम है। क्या डेटाटेबल से सशर्त रूप से कॉलम चुनने का एक और बेवकूफ तरीका है?

+7

'\' [.noquote \ '(डीटी, सी ('ए', 'बी', अगर (कुछ शर्त) 'सी'))' या 'डीटी [, सी ('ए', 'बी', अगर (कुछ कंडिशन) 'सी'), = गलत] के साथ 'यदि आप '[.noquote'' के चमत्कारों की सराहना नहीं कर सकते हैं। – Frank

+2

यह सुनिश्चित नहीं है कि इसे डुप्लिकेट के रूप में क्यों चिह्नित किया गया है .. कृपया एक बग रिपोर्ट दर्ज करें। – Arun

+0

@akrun, स्पष्ट रूप से 'डीटी [,। (ए, बी, अगर (कुछ शर्त) सी)] 'काम नहीं करता है जैसा कि यह करना चाहिए। यह एक डुप्लिकेट क्यों होगा? – Arun

उत्तर

2

मुझे लगता है कि .SDcols तर्क क्या आप चाहते हैं। डेटाटेबल डीएफ के लिए उपर्युक्त उदाहरण में,

DF[, .SD, .SDcols= c("a","b", if(someCondition) "c")] 

आपके डेटा.फ्रेम जैसा ही कार्य करेगा। आप इसे नीचे दिए गए उदाहरण में भी कार्यान्वित कर सकते हैं।

DF[, .SD, .SDcols=if(someCondition) c("a","b","c") else c("a","b")] 

वांछित चयन करेगा। पिछली पंक्ति में, आप सच्चे और झूठे वैक्टरों के अधिक विस्तृत निर्माण स्थापित कर सकते हैं (जो चीज को संक्षिप्त रखने के उद्देश्य को हरा सकते हैं)।