2015-09-07 4 views
6

मैं समूह एक को छोड़कर सभी स्तंभों द्वारा data.table का उपयोग कर सकते हैं? मेरे पास बहुत सारे कॉलम हैं, इसलिए मैं सभी colnames लिखने से बचना चाहता हूं।data.table - सभी एक स्तंभ को छोड़कर द्वारा समूह

कारण किया जा रहा है मैं एक मेज, मैं कहाँ पता एक स्तंभ कोई प्रासंगिकता है में डुप्लिकेट संक्षिप्त करने के लिए करना चाहते हैं।

> DT[, print(.SD), .(N, val)] 
    collapse 
1:  A 
    collapse 
1:  B 
2:  C 

वास्तव में .(N, val) बताए बिना:

library(data.table) 

DT <- structure(list(N = c(1, 2, 2), val = c(50, 60, 60), collapse = c("A", 
"B", "C")), .Names = c("N", "val", "collapse"), row.names = c(NA, 
-3L), class = c("data.table", "data.frame")) 

> DT 
    N val collapse 
1: 1 50  A 
2: 2 60  B 
3: 2 60  C 

है यही कारण है कि, यह देखते हुए DT, वहाँ DT[, print(.SD), by = !collapse] की तरह की तरह कुछ है जो देता है? मुझे एहसास है कि मैं कॉलम नामों की प्रतिलिपि बनाकर चिपकाकर ऐसा कर सकता हूं, लेकिन मैंने सोचा कि ऐसा करने के लिए कुछ शानदार तरीका भी हो सकता है।

+0

मैं इस लगता है कि यह लगभग एक शिकार है http://stackoverflow.com/questions/29368785/how-to-pass-all-columns-except-one -स-तर्क-टू-सेटकी –

उत्तर

8
एक को छोड़कर सभी स्तंभों द्वारा समूह के लिए

, तो आप उपयोग कर सकते हैं:

by = setdiff(names(DT), "collapse") 

स्पष्टीकरण: setdiff जो x के सभी मानों रिटर्न setdiff(x, y) के सामान्य रूप ले लेता है कि y में नहीं हैं। इस मामले में इसका मतलब है कि सभी कॉलमनाम collapse -column को छोड़कर वापस कर दिए जाते हैं।


दो विकल्प:

# with '%in%' 
names(dt1)[!names(dt1) %in% 'colB'] 

# with 'is.element' 
names(dt1)[!is.element(names(dt1), 'colB')] 
+0

बिल्कुल सही, धन्यवाद। जाहिर है मुझे इसे स्वीकार करने के लिए इंतजार करना है। –

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