Data.table कॉलम (कॉपी किए बिना) को फिर से कैसे करें


118

मैं अपने कॉलमों को पुन: क्रमित करना चाहूंगा data.table x, जो कॉलम नाम के वर्ण वेक्टर दिए गए हैं neworder:

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
neworder <- c("c", "b", "a")

जाहिर है मैं कर सकता था:

x[ , neworder, with = FALSE]
# or
x[ , ..neworder]
#            c b a
# 1: 0.8476623 3 1
# 2: 0.4787768 2 2
# 3: 0.3570803 1 3

लेकिन पूरे डेटासेट को फिर से कॉपी करने की आवश्यकता होगी। क्या इसे करने का और कोई तरीका है?

जवाबों:


183

उपयोग करें setcolorder():

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
x
#      a b         c
# [1,] 1 3 0.2880365
# [2,] 2 2 0.7785115
# [3,] 3 1 0.3297416
setcolorder(x, c("c", "b", "a"))
x
#              c b a
# [1,] 0.2880365 3 1
# [2,] 0.7785115 2 2
# [3,] 0.3297416 1 3

से ?setcolorder:

में data.tableभाषा, सभी set*कार्यों संदर्भ द्वारा उनके इनपुट बदल जाते हैं। यही है, कोई भी नकल बिल्कुल भी नहीं की जाती है, अस्थायी कामकाजी मेमोरी के अलावा, जो एक कॉलम जितनी बड़ी है।

तो बहुत कुशल होना चाहिए। ?setcolorderविवरण के लिए देखें।


21
छोटा स्पष्टीकरण: setcolorderकिसी भी कार्यशील मेमोरी का उपयोग किए बिना कॉलम पॉइंटर्स को चारों ओर ले जाता है। एक स्तंभ के रूप में बड़े रूप में काम कर रहे स्मृति का उपयोग करने के बारे में वाक्य setkeyवास्तव में है।
मैट डोले

2
@MatthewDowle - स्पष्टीकरण के लिए धन्यवाद। मैंने सोचा था कि ऐसा हो सकता है, लेकिन 100% निश्चित नहीं था।
पीछा करें

3
क्या मैं स्तंभों के सबसेट के लिए ऐसा कर सकता हूं? उदाहरण के लिए जब मैं सिर्फ कॉलम को आगे की ओर ले जाना चाहता हूं?
पीटर पैन

5
setcolorder(df, c("someCol",colnames(dt)[!(colnames(dt) %in% c("someCol"))]))
at

6
@PeterPan डेवेल संस्करण 1.10.5 के बारे में समाचार भी देखें : " setcolorder()अब ncol(DT)स्तंभों की तुलना में कम मोर्चे पर जाना स्वीकार करता है "
हेनरिक

12

किसी को उपरोक्त समाधान का उपयोग करना आसान लग सकता है, लेकिन इसके बजाय कॉलम संख्या के अनुसार। उदाहरण के लिए: पुस्तकालय (data.table)

    > x <- data.table(a = 1:3, b = 3:1, c = runif(3))
    > x
         a b         c
    [1,] 1 3 0.2880365
    [2,] 2 2 0.7785115
    [3,] 3 1 0.3297416
    > setcolorder(x, c(3,2,1))
    > x
         c         b a
    [1,] 0.2880365 3 1
    [2,] 0.7785115 2 2
    [3,] 0.3297416 1 3

13
यह आमतौर पर संख्याओं द्वारा स्तंभों को संदर्भित करने के लिए हतोत्साहित किया जाता है, data.table और अन्य जगहों पर। डेटाटेबल faq इसके लिए पहले आइटम में यहाँ तर्क देता है: datatable.r-forge.r-project.org/datatable-faq.pdf
फ्रैंक 21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.