2012-07-27 15 views
88

एकाधिक स्तंभों data.table उपयोग करने के लिए आवंटित करने के लिए सबसे अच्छा तरीका क्या है द्वारा? उदाहरण के लिए:असाइन एकाधिक स्तंभों का उपयोग कर:, = data.table में समूह

f <- function(x) {c("hi", "hello")} 
x <- data.table(id = 1:10) 

मैं कुछ इस तरह करना चाहते हैं (जाहिर है इस वाक्य गलत है):

x[ , (col1, col2) := f(), by = "id] 

और विस्तार करने के लिए मैं एक चर में नाम के साथ कई कॉलम हो सकता है (जैसे कि column_names) और मैं क्या करना चाहते हैं:

x[ , col_names := another_f(), by = "id", with = FALSE] 

इस तरह कुछ करने के लिए सही तरीका क्या है?

+1

यह लगता है कि यह उत्तर दिया गया है: http://stackoverflow.com/questions/11308754/add-multiple-columns-to-r-data- तालिका-इन-वन-समारोह-फोन – Alex

+0

एलेक्स, यही कारण है कि इस सवाल का जवाब बहुत करीब है, लेकिन यह 'by' रूप @Christoph_J सही है कहने के लिए के साथ संयोजन में काम करने के लिए प्रतीत नहीं होता। अपने प्रश्न का लिंक [# 2120 एफआर] (https://r-forge.r-project.org/tracker/index.php?func=detail&aid=2120&group_id=240&atid=978) "ड्रॉप एलएचएस के लिए = FALSE के साथ की जरूरत को जोड़ा गया का: = ", तो यह पुनरीक्षण करने के लिए भुला नहीं जाएगा। –

उत्तर

106

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

x <- data.table(a = 1:3, b = 1:6) 
f <- function(x) {list("hi", "hello")} 
x[ , c("col1", "col2") := f(), by = a][] 
# a b col1 col2 
# 1: 1 1 hi hello 
# 2: 2 2 hi hello 
# 3: 3 3 hi hello 
# 4: 1 4 hi hello 
# 5: 2 5 hi hello 
# 6: 3 6 hi hello 

x[ , c("mean", "sum") := list(mean(b), sum(b)), by = a][] 
# a b col1 col2 mean sum 
# 1: 1 1 hi hello 2.5 5 
# 2: 2 2 hi hello 3.5 7 
# 3: 3 3 hi hello 4.5 9 
# 4: 1 4 hi hello 2.5 5 
# 5: 2 5 hi hello 3.5 7 
# 6: 3 6 hi hello 4.5 9 

mynames = c("Name1", "Longer%") 
x[ , (mynames) := list(mean(b) * 4, sum(b) * 3), by = a] 
#  a b col1 col2 mean sum Name1 Longer% 
# 1: 1 1 hi hello 2.5 5 10  15 
# 2: 2 2 hi hello 3.5 7 14  21 
# 3: 3 3 hi hello 4.5 9 18  27 
# 4: 1 4 hi hello 2.5 5 10  15 
# 5: 2 5 hi hello 3.5 7 14  21 
# 6: 3 6 hi hello 4.5 9 18  27 


x[ , mynames := list(mean(b) * 4, sum(b) * 3), by = a, with = FALSE][] # same 
# a b col1 col2 mean sum Name1 Longer% 
# 1: 1 1 hi hello 2.5 5 10  15 
# 2: 2 2 hi hello 3.5 7 14  21 
# 3: 3 3 hi hello 4.5 9 18  27 
# 4: 1 4 hi hello 2.5 5 10  15 
# 5: 2 5 hi hello 3.5 7 14  21 
# 6: 3 6 hi hello 4.5 9 18  27 

x[ , get("mynames") := list(mean(b) * 4, sum(b) * 3), by = a][] # same 
# a b col1 col2 mean sum Name1 Longer% 
# 1: 1 1 hi hello 2.5 5 10  15 
# 2: 2 2 hi hello 3.5 7 14  21 
# 3: 3 3 hi hello 4.5 9 18  27 
# 4: 1 4 hi hello 2.5 5 10  15 
# 5: 2 5 hi hello 3.5 7 14  21 
# 6: 3 6 hi hello 4.5 9 18  27 

x[ , eval(mynames) := list(mean(b) * 4, sum(b) * 3), by = a][] # same 
# a b col1 col2 mean sum Name1 Longer% 
# 1: 1 1 hi hello 2.5 5 10  15 
# 2: 2 2 hi hello 3.5 7 14  21 
# 3: 3 3 hi hello 4.5 9 18  27 
# 4: 1 4 hi hello 2.5 5 10  15 
# 5: 2 5 hi hello 3.5 7 14  21 
# 6: 3 6 hi hello 4.5 9 18  27 
+0

इस उत्तर और उदाहरण के लिए धन्यवाद। प्रत्येक पंक्ति के लिए दो कॉलम प्राप्त करने के लिए मुझे निम्न पंक्ति को कैसे संशोधित करना चाहिए, दो पंक्तियों वाले एक कॉलम के बजाय, मंद आउटपुट से नाम? 'Data.table (objectname = ls()) [, सी (" पंक्तियों "," कॉलम "): = मंद (मिल (objectname)), = द्वारा objectname]' (मैं 'data.table' 1.8 उपयोग कर रहा हूँ। 11) – dnlbrky

+0

@dnlbrky 'dim' एक वेक्टर लौटाता है ताकि कनवर्ट किया जा सके कि 'list' टाइप करने के लिए इसे घुमाया जाना चाहिए; जैसे '[, सी (" पंक्तियों "," कॉलम "): = as.list (मंद (मिल (objectname))), = objectNa द्वारा मुझे]'। समस्या यह है कि 'as.list' ने ओवरहेड पर कॉल किया है और छोटे वेक्टर की प्रतिलिपि भी बनाई है। यदि दक्षता एक समस्या है क्योंकि समूहों की संख्या बढ़ती है तो कृपया हमें बताएं। –

+0

धन्यवाद @Matt_Dowle। मैंने 'सूची' की कोशिश की लेकिन 'as.list' नहीं। गति एक मुद्दा नहीं है। सिर्फ उस माहौल में वस्तुओं को खोजने का एक त्वरित तरीका था, जिसमें कॉलम या पंक्तियों की एक निश्चित संख्या थी। यह विषय बंद है, लेकिन ... एनसीओएल को 'टेबल()' में जोड़ने के बारे में आप क्या सोचते हैं? – dnlbrky

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