2012-07-31 8 views
26

में गतिशील कॉलम नाम मैं अपने data.table पर कॉलम जोड़ने की कोशिश कर रहा हूं, जहां नाम गतिशील हैं। मैं इन कॉलम को जोड़ने के दौरान by तर्क का उपयोग करने की आवश्यकता है।डेटा.table

test_dtb <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10,10)) 
cn <- parse(text = "blah") 
test_dtb[ , eval(cn) := mean(a), by = id] 

# Error in `[.data.table`(test_dtb, , `:=`(eval(cn), mean(a)), by = id) : 
# LHS of := must be a single column name when with=TRUE. When with=FALSE the LHS may be a vector of column names or positions. 

एक और प्रयास: मैथ्यू से

cn <- "blah" 
test_dtb[ , cn := mean(a), by = id, with = FALSE] 
# Error in `[.data.table`(test_dtb, , `:=`(cn, mean(a)), by = id, with = FALSE) : 'with' must be TRUE when 'by' or 'keyby' is provided 

अद्यतन:

यह अब आर-फोर्ज v1.8.3 में काम करता है उदाहरण के लिए। हाइलाइट करने के लिए धन्यवाद!
नया उदाहरण के लिए इस समान प्रश्न देखें:

Assign multiple columns using data.table, by group

उत्तर

22

data.table 1.9.4 से, आप बस करो यह कर सकते हैं: ?:= में

## A parenthesized symbol, `(cn)`, gets evaluated to "blah" before `:=` is carried out 
test_dtb[, (cn) := mean(a), by = id] 
head(test_dtb, 4) 
#  a b id blah 
# 1: 41 19 1 54.2 
# 2: 4 99 2 50.0 
# 3: 49 85 3 46.7 
# 4: 61 4 4 57.1 

देखें विवरण:

DT[i, (colvector) := val]

[...] अब पूर्व निर्धारित [...] वाक्यविन्यास। माता-पिता एलएचएस को प्रतीक होने से रोकने के लिए पर्याप्त हैं; एक ही c(colvector) रूप


मूल जवाब:

आप बिल्कुल सही रास्ते पर थे: एक अभिव्यक्ति का निर्माण करने के लिए [.data.table कॉल के भीतर मूल्यांकन किया जाना data.table तरीके से करना है इस तरह की चीज। कुछ और आगे जा रहे हैं, पूरेj तर्क (केवल बाएं हाथ की बजाय) का मूल्यांकन करने वाली अभिव्यक्ति का निर्माण क्यों न करें?

## Your code so far 
library(data.table) 
test_dtb <- data.table(a=sample(1:100, 100),b=sample(1:100, 100),id=rep(1:10,10)) 
cn <- "blah" 

## One solution 
expr <- parse(text = paste0(cn, ":=mean(a)")) 
test_dtb[,eval(expr), by=id] 

## Checking the result 
head(test_dtb, 4) 
#  a b id blah 
# 1: 30 26 1 38.4 
# 2: 83 82 2 47.4 
# 3: 47 66 3 39.5 
# 4: 87 23 4 65.2 
+0

शानदार, धन्यवाद। मैं शपथ ले सकता था कि मैंने उस बदलाव की कोशिश की लेकिन स्पष्ट रूप से मैंने नहीं किया। बहुत सराहना की मदद करें। – Alex

+0

+1 इस प्रश्न का लिंक जोड़ा गया [FR # 2120] (https://r-forge.r-project.org/tracker/index.php?func=detail&aid=2120&group_id=240&atid=978)। लगता है कि काफी कुछ आ रहा है। –

15

अभिव्यक्ति bquote साथ निर्माण किया जा सकता:

कुछ इस तरह चाल करना चाहिए।

cn <- "blah" 
expr <- bquote(.(as.name(cn)):=mean(a)) 
test_dtb[,eval(expr), by=id] 
+1

"गतिशील डेटा.tabling" करने से बहुत अच्छा है – Juancentro

+0

ग्रेट उत्तर, बहुत उपयोगी और लचीला दृष्टिकोण। +1! – marbel

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