एक ही डेटा तालिका में विभिन्न कॉलम से मूल्यों के लिए डेटा तालिका में एकाधिक कॉलम कैसे सेट करें?

मान लीजिए कि मेरे पास 6 कॉलम के साथ डेटा फ्रेम है, और मैं कर्नल 1: 3 को कॉल 4: 6 में मानों पर सेट करना चाहता हूं (यह विलय होने पर बहुत कुछ आता है)। डेटा फ्रेम के साथ यह आसान है:

set.seed(1)
df <- data.frame(matrix(sample(1:100,30),ncol=6))
df
#   X1 X2 X3 X4 X5 X6
# 1 27 86 19 43 75 29
# 2 37 97 16 88 17  1
# 3 57 62 61 83 51 28
# 4 89 58 34 32 10 81
# 5 20  6 67 63 21 25

df[,1:3] <- df[,4:6]                    # very, very straightforward...
df
#   X1 X2 X3 X4 X5 X6
# 1 43 75 29 43 75 29
# 2 88 17  1 88 17  1
# 3 83 51 28 83 51 28
# 4 32 10 81 32 10 81
# 5 63 21 25 63 21 25

डेटा.tables के साथ, इतना नहीं:

library(data.table)
dt <- data.table(df)
dt[,1:3,with=F] <- dt[,4:6,with=F]
## Error in `[<-.data.table`(`*tmp*`, , 1:3, with = F, value = list(X4 = c(43L,  : unused argument (with = F)

यह काम करता है, लेकिन इस तरह के एक सरल परिवर्तन के लिए बेहद जटिल लगता है:

dt[, names(dt)[1:3]:=dt[,4:6,with=F]]   # very, very complicated...
dt
#    X1 X2 X3 X4 X5 X6
# 1: 43 75 29 43 75 29
# 2: 88 17  1 88 17  1
# 3: 83 51 28 83 51 28
# 4: 32 10 81 32 10 81
# 5: 63 21 25 63 21 25

The question is: is there a simpler way to assign one set of columns in a data table to the values from another set of columns in the same data table?

10

2 उत्तर

आप प्रत्येक डेटा में : = ऑपरेटर और with = FALSE का उपयोग कर सकते हैं:

dt[, 1:3 := dt[, 4:6, with=FALSE], with=FALSE]

> dt
   X1 X2 X3 X4 X5 X6
1: 43 75 29 43 75 29
2: 88 17  1 88 17  1
3: 83 51 28 83 51 28
4: 32 10 81 32 10 81
5: 63 21 25 63 21 25
11
जोड़ा
ओपी के पास पहले से ही यह वही है
जोड़ा लेखक eddi, स्रोत
मुझे लगता है कि मैं ओपी के बिंदु से चूक गया, क्योंकि यह ओपी में नाम विकल्प के रूप में मेरे लिए जटिल है, जो बीटीडब्ल्यू भी काम करता है।
जोड़ा लेखक eddi, स्रोत
यह पहले से ही है। @eddi यह लगभग ओपी है, लेकिन मेरा काम करता है :)
जोड़ा लेखक Justin, स्रोत
महान! धन्यवाद @ जस्टिन, यही वह है जिसे मैं ढूंढ रहा था। बोलने के लिए "चाल" दो बार with = f का उपयोग कर रही है ... कृपया पीछे ] जोड़ें। मैंने कोशिश की, लेकिन SO मुझे नहीं जाने देंगे।
जोड़ा लेखक jlhoward, स्रोत
+1 एक बंद ब्रैकेट गुम है?
जोड़ा लेखक Matthew Plourde, स्रोत

शायद लूप के लिए बेहतर लग रहा होगा?

for (i in 1:3) dt[[i]] = dt[[i+3]]
3
जोड़ा
@ अरुण यकीन है, लेकिन मैंने सोचा कि ओपी का लक्ष्य सादगी था, दक्षता नहीं
जोड़ा लेखक eddi, स्रोत
मैं उस "क्यों" के कई कारणों से आ सकता हूं :) वैसे भी, ओपी की तरह दिखता है कि वे क्या चाहते थे।
जोड़ा लेखक eddi, स्रोत
@ अरुण का लेना सही है। मैं स्वीकार करता हूं कि डेटा तालिकाओं को नामित कॉलम की आवश्यकता होती है जब तक कि आप with = f शामिल नहीं करते हैं, और : = का उपयोग करके प्राथमिकता दी जाती है, इसलिए तालिका की प्रतिलिपि नहीं बनाई जाती है। हालांकि, मैं आश्चर्यचकित था कि dt [ 1: 3, = f के साथ] एलएचएस पर अनुमति नहीं है। यह बहुत काउंटर अंतर्ज्ञानी लगता है। असल में, मैंने with = f को दो बार उपयोग करने के अलावा सब कुछ करने की कोशिश की। आंकड़े ...
जोड़ा लेखक jlhoward, स्रोत
यह एक प्रतिलिपि बना देगा। सेट का उपयोग करें। के लिए (मैं 1: 3 में) सेट (डीटी, i = NULL, j = i, value = dt [[i + 3]])
जोड़ा लेखक Arun, स्रोत
डेटा टेक करने योग्य के फायदे खोने के बिना मेरा लेना "सरल" था। अन्यथा, पहली जगह में "data.table" का उपयोग क्यों करें ..?
जोड़ा लेखक Arun, स्रोत